diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/404.html b/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
+

404

+

The ScyllaDB monster ate your page!

+

+ Home +

+
+ + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/check-solid.svg b/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/clipboard.min.js b/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/_static/copybutton.css b/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/_static/copybutton.js b/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/_static/copybutton_funcs.js b/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/_static/css/main.css b/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_static/file.png differ diff --git a/_static/img/banner-background.svg b/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_static/img/favicon-228x228.png b/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/_static/img/favicon-228x228.png differ diff --git a/_static/img/favicon-32x32.png b/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/_static/img/favicon-32x32.png differ diff --git a/_static/img/favicon.ico b/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/_static/img/favicon.ico differ diff --git a/_static/img/icons/icon-about-team.svg b/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/_static/img/icons/icon-about-us-m.svg b/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-about-us.svg b/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-alternator.svg b/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-apps.svg b/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-architecture.svg b/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/_static/img/icons/icon-benchmarks.svg b/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/_static/img/icons/icon-blog.svg b/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/_static/img/icons/icon-careers.svg b/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/_static/img/icons/icon-chevron-left.svg b/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/icons/icon-chevron-right.svg b/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/icons/icon-circe.svg b/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-clock.svg b/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-close.svg b/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/_static/img/icons/icon-cloud-docs.svg b/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-cloud.svg b/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-comparison.svg b/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/_static/img/icons/icon-contact-us.svg b/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/_static/img/icons/icon-developers-blog.svg b/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/_static/img/icons/icon-docs.svg b/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/_static/img/icons/icon-enterprise-m.svg b/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/img/icons/icon-enterprise.svg b/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-events.svg b/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/_static/img/icons/icon-exclamation.svg b/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_static/img/icons/icon-expand.svg b/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/_static/img/icons/icon-forum.svg b/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-getting-started.svg b/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-glossary.svg b/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-home.svg b/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-infoworld.svg b/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/_static/img/icons/icon-integrations.svg b/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-knowledge-base.svg b/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-less.svg b/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_static/img/icons/icon-live-test.svg b/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/_static/img/icons/icon-mail-list.svg b/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-manager.svg b/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/_static/img/icons/icon-memory-management.svg b/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/_static/img/icons/icon-modeling.svg b/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-monitoring.svg b/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/_static/img/icons/icon-networking.svg b/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/_static/img/icons/icon-news.svg b/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/_static/img/icons/icon-newsletter.svg b/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/_static/img/icons/icon-nsql-guides.svg b/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/_static/img/icons/icon-open-source.svg b/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/_static/img/icons/icon-operator.svg b/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-overview.svg b/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/_static/img/icons/icon-partners.svg b/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/_static/img/icons/icon-plus.svg b/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_static/img/icons/icon-pricing.svg b/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/_static/img/icons/icon-release-notes.svg b/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/_static/img/icons/icon-resource-center.svg b/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/_static/img/icons/icon-roadmap.svg b/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/_static/img/icons/icon-search.svg b/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/img/icons/icon-slack.svg b/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-stack-overflow.svg b/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/img/icons/icon-summit.svg b/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-support.svg b/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/_static/img/icons/icon-tech-talks.svg b/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/_static/img/icons/icon-testing.svg b/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/_static/img/icons/icon-thumbs-down.svg b/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-thumbs-up.svg b/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-tip.svg b/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_static/img/icons/icon-training.svg b/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/_static/img/icons/icon-triangle-down.svg b/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/icons/icon-university.svg b/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/_static/img/icons/icon-users-blog.svg b/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/_static/img/icons/icon-warning.svg b/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_static/img/icons/icon-webinars.svg b/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/_static/img/icons/icon-whitepapers.svg b/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/_static/img/icons/icon-workshop.svg b/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/_static/img/logo-docs.svg b/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/img/logo-scylla-horizontal-RGB.svg b/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/img/mascots/404.jpg b/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/_static/img/mascots/404.jpg differ diff --git a/_static/img/mascots/scylla-3monsters.png b/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/_static/img/mascots/scylla-3monsters.png differ diff --git a/_static/img/mascots/scylla-advisor-crystal.png b/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/_static/img/mascots/scylla-alternator.svg b/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/_static/img/mascots/scylla-cloud.svg b/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/_static/img/mascots/scylla-computer-3-monsters.png b/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/_static/img/mascots/scylla-computer-headset.png b/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/_static/img/mascots/scylla-computer-headset.png differ diff --git a/_static/img/mascots/scylla-cup-number-one.png b/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/_static/img/mascots/scylla-docs.svg b/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/_static/img/mascots/scylla-drivers.svg b/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/_static/img/mascots/scylla-enterprise.svg b/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/_static/img/mascots/scylla-forklift-boxes.png b/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/_static/img/mascots/scylla-forklift-migration.png b/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/_static/img/mascots/scylla-gear.png b/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/_static/img/mascots/scylla-gear.png differ diff --git a/_static/img/mascots/scylla-hardhat.png b/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/_static/img/mascots/scylla-hardhat.png differ diff --git a/_static/img/mascots/scylla-headband.png b/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/_static/img/mascots/scylla-headband.png differ diff --git a/_static/img/mascots/scylla-headset.png b/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/_static/img/mascots/scylla-headset.png differ diff --git a/_static/img/mascots/scylla-hearts.png b/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/_static/img/mascots/scylla-hearts.png differ diff --git a/_static/img/mascots/scylla-looking-down.png b/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/_static/img/mascots/scylla-looking-down.png differ diff --git a/_static/img/mascots/scylla-looking-up.png b/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/_static/img/mascots/scylla-looking-up.png differ diff --git a/_static/img/mascots/scylla-magnifying-glass-fronting.png b/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/_static/img/mascots/scylla-magnifying-glass.png b/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/_static/img/mascots/scylla-manager.svg b/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/_static/img/mascots/scylla-monitor.svg b/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/_static/img/mascots/scylla-movement-fast.png b/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/_static/img/mascots/scylla-movement-fast.png differ diff --git a/_static/img/mascots/scylla-movement.png b/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/_static/img/mascots/scylla-movement.png differ diff --git a/_static/img/mascots/scylla-onpremise.png b/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/_static/img/mascots/scylla-onpremise.png differ diff --git a/_static/img/mascots/scylla-opensource.svg b/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/_static/img/mascots/scylla-operator.svg b/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/_static/img/mascots/scylla-plugin.png b/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/_static/img/mascots/scylla-plugin.png differ diff --git a/_static/img/mascots/scylla-release-mascot.png b/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/_static/img/mascots/scylla-release-mascot.png differ diff --git a/_static/img/mascots/scylla-repair.png b/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/_static/img/mascots/scylla-repair.png differ diff --git a/_static/img/mascots/scylla-server.png b/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/_static/img/mascots/scylla-server.png differ diff --git a/_static/img/mascots/scylla-sleeping.png b/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/_static/img/mascots/scylla-sleeping.png differ diff --git a/_static/img/mascots/scylla-tall-measure.png b/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/_static/img/mascots/scylla-tall-measure.png differ diff --git a/_static/img/mascots/scylla-university.png b/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/_static/img/mascots/scylla-university.png differ diff --git a/_static/img/mascots/scylla-weights.png b/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/_static/img/mascots/scylla-weights.png differ diff --git a/_static/img/mascots/scylla-window-cleaning.png b/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/_static/img/mascots/scylla-with-computer-2.png b/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/_static/img/mascots/scylla-with-computer.png b/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/_static/img/mascots/scylla-with-computer.png differ diff --git a/_static/img/mascots/scylla-with-linux.png b/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/_static/img/mascots/scylla-with-linux.png differ diff --git a/_static/img/mascots/scylla-writting.png b/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/_static/img/mascots/scylla-writting.png differ diff --git a/_static/img/menu.svg b/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/scylla-monitor.png b/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/_static/img/scylla-monitor.png differ diff --git a/_static/js/main.bundle.js b/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
  • Back
  • ',backButtonPosition:"top",wrapper:"
    ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
      "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
      ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
      ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
      ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
      ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +

      Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

      + + +
      + + + + + +
      + + +
      + +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/branch-3.10/_images/1.png b/branch-3.10/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.10/_images/1.png differ diff --git a/branch-3.10/_images/2.png b/branch-3.10/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.10/_images/2.png differ diff --git a/branch-3.10/_images/3.png b/branch-3.10/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.10/_images/3.png differ diff --git a/branch-3.10/_images/advisor_panel.png b/branch-3.10/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-3.10/_images/advisor_panel.png differ diff --git a/branch-3.10/_images/alertmanager.png b/branch-3.10/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.10/_images/alertmanager.png differ diff --git a/branch-3.10/_images/cql_optimization_master.png b/branch-3.10/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.10/_images/cql_optimization_master.png differ diff --git a/branch-3.10/_images/grafana.png b/branch-3.10/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.10/_images/grafana.png differ diff --git a/branch-3.10/_images/monitor.png b/branch-3.10/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-3.10/_images/monitor.png differ diff --git a/branch-3.10/_images/monitoring_stack.png b/branch-3.10/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.10/_images/monitoring_stack.png differ diff --git a/branch-3.10/_images/monitoring_stack1.png b/branch-3.10/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-3.10/_images/monitoring_stack1.png differ diff --git a/branch-3.10/_sources/_common/monitor-description.rst.txt b/branch-3.10/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-3.10/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.10/_sources/index.rst.txt b/branch-3.10/_sources/index.rst.txt new file mode 100644 index 000000000..9233bc21d --- /dev/null +++ b/branch-3.10/_sources/index.rst.txt @@ -0,0 +1,42 @@ +======================== +Scylla Monitoring Stack +======================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `Scylla Monitoring Stack lesson `_ on Scylla University +* `Scylla Monitoring Stack GitHub Project `_ + +For older versions of Scylla Monitoring Stack Documentation see `here `_. \ No newline at end of file diff --git a/branch-3.10/_sources/install/docker_compose.rst.txt b/branch-3.10/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-3.10/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-3.10/_sources/install/index.rst.txt b/branch-3.10/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-3.10/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-3.10/_sources/install/min-prod-hw.rst.txt b/branch-3.10/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..443638374 --- /dev/null +++ b/branch-3.10/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,32 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. diff --git a/branch-3.10/_sources/install/monitor_without_docker.rst.txt b/branch-3.10/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..08b771b73 --- /dev/null +++ b/branch-3.10/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-3.10/_sources/install/monitoring_stack.rst.txt b/branch-3.10/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..b6fc40231 --- /dev/null +++ b/branch-3.10/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,380 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API `_ + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker ` . +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-3.10/_sources/install/start_all.rst.txt b/branch-3.10/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..574e6861c --- /dev/null +++ b/branch-3.10/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh command +======================== + +Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.10/_sources/install/thanos.rst.txt b/branch-3.10/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-3.10/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-3.10/_sources/intro.rst.txt b/branch-3.10/_sources/intro.rst.txt new file mode 100644 index 000000000..8bad4d48a --- /dev/null +++ b/branch-3.10/_sources/intro.rst.txt @@ -0,0 +1,49 @@ +======================= +Scylla Monitoring Stack +======================= + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the `node_exporter` agent that runs on the Scylla server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + + +For older versions of Scylla Monitoring Stack Documentation see `here `_. diff --git a/branch-3.10/_sources/procedures/alerts/alerting.rst.txt b/branch-3.10/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.10/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.10/_sources/procedures/alerts/index.rst.txt b/branch-3.10/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-3.10/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-3.10/_sources/procedures/index.rst.txt b/branch-3.10/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..5ad1f631f --- /dev/null +++ b/branch-3.10/_sources/procedures/index.rst.txt @@ -0,0 +1,18 @@ +========================================= +Scylla Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Alert Manager + Adding and Modifying Dashboards + Upgrade Guide + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* `Upgrade Guide `_ diff --git a/branch-3.10/_sources/procedures/updating_dashboard.rst.txt b/branch-3.10/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-3.10/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.10/_sources/reference/index.rst.txt b/branch-3.10/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-3.10/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-3.10/_sources/reference/matrix.rst.txt b/branch-3.10/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..543acab4c --- /dev/null +++ b/branch-3.10/_sources/reference/matrix.rst.txt @@ -0,0 +1,115 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.10/_sources/reference/monitoring_apis.rst.txt b/branch-3.10/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..ce53e9d8f --- /dev/null +++ b/branch-3.10/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring_stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.10/_sources/troubleshooting/index.rst.txt b/branch-3.10/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-3.10/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-3.10/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-3.10/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..a2e14a1f4 --- /dev/null +++ b/branch-3.10/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,221 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.10/_sources/upgrade/index.rst.txt b/branch-3.10/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..f4d76733b --- /dev/null +++ b/branch-3.10/_sources/upgrade/index.rst.txt @@ -0,0 +1,39 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
      +
      +
      +
      Upgrade Scylla Open Source
      +
      +
      + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
      +
      +
      diff --git a/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..0e4fd3baa --- /dev/null +++ b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,103 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + + + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade
      ` +* `Prometheus Migration `_ diff --git a/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..3bb8af42b --- /dev/null +++ b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,132 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..d1974adfc --- /dev/null +++ b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,63 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..a356f5c21 --- /dev/null +++ b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,138 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-3.10/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..2454af1d4 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,13 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +Scylla runs compaction periodically as a background process. While running compaction is important, there are situations that +the compaction takes too much CPU. +In those cases the compaction would impact the overall system performance. + +When facing this problem, you can statically limit the compaction shares with one of two options: + +1. Change ``scylla.yml`` to have ``compaction_static_shares: 100`` + +or + +2. Start scylla with ``--compaction-static-shares 100`` \ No newline at end of file diff --git a/branch-3.10/_sources/use-monitoring/advisor/index.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-3.10/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-3.10/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-3.10/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-3.10/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-3.10/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-3.10/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-3.10/_sources/use-monitoring/cql_optimization.rst.txt b/branch-3.10/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-3.10/_sources/use-monitoring/index.rst.txt b/branch-3.10/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-3.10/_static/basic.css b/branch-3.10/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.10/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.10/_static/check-solid.svg b/branch-3.10/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.10/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.10/_static/clipboard.min.js b/branch-3.10/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.10/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.10/_static/copybutton.css b/branch-3.10/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.10/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

      Short

      + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.10/_static/copybutton.js b/branch-3.10/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.10/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.10/_static/copybutton_funcs.js b/branch-3.10/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.10/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.10/_static/css/main.css b/branch-3.10/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-3.10/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.10/_static/doctools.js b/branch-3.10/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.10/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.10/_static/documentation_options.js b/branch-3.10/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-3.10/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.10/_static/file.png b/branch-3.10/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.10/_static/file.png differ diff --git a/branch-3.10/_static/img/banner-background.svg b/branch-3.10/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.10/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.10/_static/img/favicon-228x228.png b/branch-3.10/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.10/_static/img/favicon-228x228.png differ diff --git a/branch-3.10/_static/img/favicon-32x32.png b/branch-3.10/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.10/_static/img/favicon-32x32.png differ diff --git a/branch-3.10/_static/img/favicon.ico b/branch-3.10/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.10/_static/img/favicon.ico differ diff --git a/branch-3.10/_static/img/icons/icon-about-team.svg b/branch-3.10/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.10/_static/img/icons/icon-about-us-m.svg b/branch-3.10/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-about-us.svg b/branch-3.10/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-alternator.svg b/branch-3.10/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-apps.svg b/branch-3.10/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-architecture.svg b/branch-3.10/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.10/_static/img/icons/icon-benchmarks.svg b/branch-3.10/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.10/_static/img/icons/icon-blog.svg b/branch-3.10/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.10/_static/img/icons/icon-careers.svg b/branch-3.10/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.10/_static/img/icons/icon-chevron-left.svg b/branch-3.10/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.10/_static/img/icons/icon-chevron-right.svg b/branch-3.10/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.10/_static/img/icons/icon-circe.svg b/branch-3.10/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-clock.svg b/branch-3.10/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-close.svg b/branch-3.10/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-cloud-docs.svg b/branch-3.10/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-cloud.svg b/branch-3.10/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-comparison.svg b/branch-3.10/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.10/_static/img/icons/icon-contact-us.svg b/branch-3.10/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.10/_static/img/icons/icon-developers-blog.svg b/branch-3.10/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.10/_static/img/icons/icon-docs.svg b/branch-3.10/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.10/_static/img/icons/icon-enterprise-m.svg b/branch-3.10/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-enterprise.svg b/branch-3.10/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-events.svg b/branch-3.10/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.10/_static/img/icons/icon-exclamation.svg b/branch-3.10/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-expand.svg b/branch-3.10/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-forum.svg b/branch-3.10/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-getting-started.svg b/branch-3.10/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-glossary.svg b/branch-3.10/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-home.svg b/branch-3.10/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-infoworld.svg b/branch-3.10/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.10/_static/img/icons/icon-integrations.svg b/branch-3.10/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-knowledge-base.svg b/branch-3.10/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-less.svg b/branch-3.10/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-live-test.svg b/branch-3.10/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.10/_static/img/icons/icon-mail-list.svg b/branch-3.10/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-manager.svg b/branch-3.10/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.10/_static/img/icons/icon-memory-management.svg b/branch-3.10/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.10/_static/img/icons/icon-modeling.svg b/branch-3.10/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-monitoring.svg b/branch-3.10/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.10/_static/img/icons/icon-networking.svg b/branch-3.10/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.10/_static/img/icons/icon-news.svg b/branch-3.10/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.10/_static/img/icons/icon-newsletter.svg b/branch-3.10/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.10/_static/img/icons/icon-nsql-guides.svg b/branch-3.10/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.10/_static/img/icons/icon-open-source.svg b/branch-3.10/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.10/_static/img/icons/icon-operator.svg b/branch-3.10/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-overview.svg b/branch-3.10/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.10/_static/img/icons/icon-partners.svg b/branch-3.10/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.10/_static/img/icons/icon-plus.svg b/branch-3.10/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-pricing.svg b/branch-3.10/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.10/_static/img/icons/icon-release-notes.svg b/branch-3.10/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.10/_static/img/icons/icon-resource-center.svg b/branch-3.10/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.10/_static/img/icons/icon-roadmap.svg b/branch-3.10/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.10/_static/img/icons/icon-search.svg b/branch-3.10/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.10/_static/img/icons/icon-slack.svg b/branch-3.10/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-stack-overflow.svg b/branch-3.10/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.10/_static/img/icons/icon-summit.svg b/branch-3.10/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-support.svg b/branch-3.10/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.10/_static/img/icons/icon-tech-talks.svg b/branch-3.10/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.10/_static/img/icons/icon-testing.svg b/branch-3.10/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.10/_static/img/icons/icon-thumbs-down.svg b/branch-3.10/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-thumbs-up.svg b/branch-3.10/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-tip.svg b/branch-3.10/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.10/_static/img/icons/icon-training.svg b/branch-3.10/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.10/_static/img/icons/icon-triangle-down.svg b/branch-3.10/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.10/_static/img/icons/icon-university.svg b/branch-3.10/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.10/_static/img/icons/icon-users-blog.svg b/branch-3.10/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.10/_static/img/icons/icon-warning.svg b/branch-3.10/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-webinars.svg b/branch-3.10/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.10/_static/img/icons/icon-whitepapers.svg b/branch-3.10/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.10/_static/img/icons/icon-workshop.svg b/branch-3.10/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/logo-docs.svg b/branch-3.10/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.10/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.10/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.10/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.10/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.10/_static/img/mascots/404.jpg b/branch-3.10/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.10/_static/img/mascots/404.jpg differ diff --git a/branch-3.10/_static/img/mascots/scylla-3monsters.png b/branch-3.10/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.10/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-alternator.svg b/branch-3.10/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.10/_static/img/mascots/scylla-cloud.svg b/branch-3.10/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.10/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.10/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-computer-headset.png b/branch-3.10/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-cup-number-one.png b/branch-3.10/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-docs.svg b/branch-3.10/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.10/_static/img/mascots/scylla-drivers.svg b/branch-3.10/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.10/_static/img/mascots/scylla-enterprise.svg b/branch-3.10/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.10/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.10/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-forklift-migration.png b/branch-3.10/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-gear.png b/branch-3.10/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-hardhat.png b/branch-3.10/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-headband.png b/branch-3.10/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-headset.png b/branch-3.10/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-hearts.png b/branch-3.10/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-looking-down.png b/branch-3.10/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-looking-up.png b/branch-3.10/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.10/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.10/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-manager.svg b/branch-3.10/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.10/_static/img/mascots/scylla-monitor.svg b/branch-3.10/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.10/_static/img/mascots/scylla-movement-fast.png b/branch-3.10/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-movement.png b/branch-3.10/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-onpremise.png b/branch-3.10/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-opensource.svg b/branch-3.10/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.10/_static/img/mascots/scylla-operator.svg b/branch-3.10/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.10/_static/img/mascots/scylla-plugin.png b/branch-3.10/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-release-mascot.png b/branch-3.10/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-repair.png b/branch-3.10/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-server.png b/branch-3.10/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-sleeping.png b/branch-3.10/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-tall-measure.png b/branch-3.10/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-university.png b/branch-3.10/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-weights.png b/branch-3.10/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-window-cleaning.png b/branch-3.10/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-with-computer-2.png b/branch-3.10/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-with-computer.png b/branch-3.10/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-with-linux.png b/branch-3.10/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-writting.png b/branch-3.10/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.10/_static/img/menu.svg b/branch-3.10/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.10/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.10/_static/img/scylla-monitor.png b/branch-3.10/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.10/_static/img/scylla-monitor.png differ diff --git a/branch-3.10/_static/js/main.bundle.js b/branch-3.10/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-3.10/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
    • Back
    • ',backButtonPosition:"top",wrapper:"
      ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
        "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
        ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
        ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
        ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
        ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + + + +
        + + + + + +
        + + +
        + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/index.html b/branch-3.10/index.html new file mode 100644 index 000000000..ce20f9a9d --- /dev/null +++ b/branch-3.10/index.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack

        +
        +
        +

        Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

        +_images/monitor.png +

        The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

        +
          +
        • prometheus - collects and stores metrics

        • +
        • alertmanager - handles alerts

        • +
        • grafana - dashboard server

        • +
        +

        Choose a topic to get started:

        + +

        For older versions of Scylla Monitoring Stack Documentation see here.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/docker_compose.html b/branch-3.10/install/docker_compose.html new file mode 100644 index 000000000..0a18c3978 --- /dev/null +++ b/branch-3.10/install/docker_compose.html @@ -0,0 +1,816 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Using Docker Compose

        +

        Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

        +

        Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

        +
        +

        Warning

        +

        docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

        +
        +
        +

        Prerequisite

        +

        Make sure you have docker and docker-compose installed.

        +
        +
        +

        Setting Prometheus

        +

        The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

        +

        You can use ./prometheus-config.sh to generate the file, for example:

        +
        ./prometheus-config.sh --compose
        +
        +
        +

        For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

        +
        +
        +

        Setting Grafana Provisioning

        +

        Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

        +
        +

        Grafana Data-Source file

        +

        Run the following command to update the datasource:

        +
        ./grafana-datasource.sh --compose
        +
        +
        +

        You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

        +
        +
        +

        Grafana Dashboard Load file

        +

        To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

        +
        ./generate-dashboards.sh -t -v 2020.1
        +
        +
        +

        This command generates the files under: grafana/provisioning/dashboards/

        +
        +
        +
        +

        Docker Compose file

        +

        You can use the following example as a base for your docker compose.

        +

        Pass the following to a file called docker-compose.yml

        +
        services:
        +  alertmanager:
        +    container_name: aalert
        +    image: prom/alertmanager:v0.21.0
        +    ports:
        +    - 9093:9093
        +    volumes:
        +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
        +  grafana:
        +    container_name: agraf
        +    environment:
        +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
        +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
        +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
        +    # This is where you set Grafana security
        +    - GF_AUTH_BASIC_ENABLED=false
        +    - GF_AUTH_ANONYMOUS_ENABLED=true
        +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
        +    - GF_SECURITY_ADMIN_PASSWORD=admin
        +    image: grafana/grafana:7.3.5
        +    ports:
        +    - 3000:3000
        +    user: 1000:1000
        +    volumes:
        +    - ./grafana/build:/var/lib/grafana/dashboards
        +    - ./grafana/plugins:/var/lib/grafana/plugins
        +    - ./grafana/provisioning:/var/lib/grafana/provisioning
        +    # Uncomment the following line for grafana persistency
        +    # - path/to/grafana/dir:/var/lib/grafana
        +  loki:
        +    command:
        +    - --config.file=/mnt/config/loki-config.yaml
        +    container_name: loki
        +    image: grafana/loki:2.0.0
        +    ports:
        +    - 3100:3100
        +    volumes:
        +    - ./loki/rules:/etc/loki/rules
        +    - ./loki/conf:/mnt/config
        +  promotheus:
        +    command:
        +    - --config.file=/etc/prometheus/prometheus.compose.yml
        +    container_name: aprom
        +    image: prom/prometheus:v2.18.1
        +    ports:
        +    - 9090:9090
        +    volumes:
        +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
        +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
        +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
        +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
        +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
        +    # Uncomment the following line for prometheus persistency 
        +    # - path/to/data/dir:/prometheus/data
        +  promtail:
        +    command:
        +    - --config.file=/etc/promtail/config.yml
        +    container_name: promtail
        +    image: grafana/promtail:2.0.0
        +    ports:
        +    - 1514:1514
        +    - 9080:9080
        +    volumes:
        +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
        +version: '3'
        +
        +
        +
        +

        Start and Stop

        +

        To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/index.html b/branch-3.10/install/index.html new file mode 100644 index 000000000..c3f110e31 --- /dev/null +++ b/branch-3.10/install/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Download and Install Scylla Monitoring Stack

        +
        +
        +

        Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

        +

        Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/min-prod-hw.html b/branch-3.10/install/min-prod-hw.html new file mode 100644 index 000000000..1ed6abd96 --- /dev/null +++ b/branch-3.10/install/min-prod-hw.html @@ -0,0 +1,706 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Minimal Production System Recommendations

        +
          +
        • CPU - at least 2 physical cores/ 4vCPUs

        • +
        • Memory - 15GB+ DRAM and proportional to the number of cores.

        • +
        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

        • +
        • Network - 1GbE/10GbE preferred

        • +
        +
        +

        Calculating Prometheus Minimal Disk Space requirement

        +

        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

        +

        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

        +

        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

        +
        6 * 16 * 15 * 12MB ~ 16GB
        +
        +
        +

        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

        +
        +
        +

        Calculating Prometheus Minimal Memory Space requirement

        +

        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

        +

        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/monitor_without_docker.html b/branch-3.10/install/monitor_without_docker.html new file mode 100644 index 000000000..b87f89eea --- /dev/null +++ b/branch-3.10/install/monitor_without_docker.html @@ -0,0 +1,1122 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Deploying Scylla Monitoring Stack Without Docker

        +
        +

        Introduction

        +

        The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

        +

        Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

        +

        Scylla Monitoring uses the following components:

        +
          +
        • Alertmanager

        • +
        • Grafana Loki

        • +
        • Prometheus

        • +
        • Grafana

        • +
        +

        The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

        +

        We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

        +
        +
        +

        Minimal Production System Recommendations

        +
          +
        • CPU - at least 2 physical cores/ 4vCPUs

        • +
        • Memory - 15GB+ DRAM and proportional to the number of cores.

        • +
        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

        • +
        • Network - 1GbE/10GbE preferred

        • +
        +
        +

        Calculating Prometheus Minimal Disk Space requirement

        +

        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

        +

        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

        +

        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

        +
        6 * 16 * 15 * 12MB ~ 16GB
        +
        +
        +

        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

        +
        +
        +

        Calculating Prometheus Minimal Memory Space requirement

        +

        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

        +

        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

        +

        The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

        +
        +

        Note

        +

        Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

        +
        +
        +
        +
        +

        Install Scylla Monitoring Stack

        +

        The following procedure uses a CentOS 7 based instance

        +
          +
        1. Download the latest Scylla Monitoring Stack release.

        2. +
        +
        wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-3.10.1.tar.gz
        +
        +
        +
          +
        1. Open the tar

        2. +
        +

        tar -xvf scylla-monitoring-*.tar.gz

        +
        +
        +

        Install Alertmanager

        +

        Tested with alertmanager 0.22.2 version

        +
          +
        1. Install alertmanager

        2. +
        +
        wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
        +tar -xvf alertmanager-*.linux-amd64.tar.gz
        +
        +
        +
          +
        1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

        2. +
        +

        For example:

        +
        cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.10.1/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
        +
        +
        +
          +
        1. Start the Alertmanager

        2. +
        +

        For example:

        +
        cd alertmanager-0.22.2.linux-amd64
        +./alertmanager
        +
        +
        +
          +
        1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

        2. +
        +

        For example:

        +
        http://192.168.135.166:9093/
        +
        +
        +../_images/alertmanager.png +
        +
        +

        Install Grafana Loki

        +

        Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

        +

        We recomand using Loki with containers, but you can install it locally as described in Loki installation

        +

        You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

        +

        Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

        +

        Loki Related files

        +

        Loki has a configuration file and a rule file. You need to copy and modify the configuration.

        +
        mkdir -p /etc/loki/rules
        +mkdir -p /etc/loki/config
        +cp loki/rules/* /etc/loki/rules
        +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
        +
        +
        +

        Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

        +

        Promtail Related files

        +

        Promtail has a configuration file. You need to copy and modify the configuration.

        +
        mkdir -p /etc/promtail/
        +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
        +
        +
        +

        Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

        +
        +
        +

        Install Prometheus

        +

        Tested with Prometheus version 2.27.1

        +
        +

        Note

        +

        If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

        +
        +
          +
        1. Install Prometheus

        2. +
        +
        wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
        +tar -xvf prometheus-*.linux-amd64.tar.gz
        +
        +
        +

        2. Create Data and Config directories +.. code-block:: shell

        +
        +

        mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

        +
        +
          +
        1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

        2. +
        +

        Copy prometheus/prometheus.yml.template to prometheus.yml

        +

        For example:

        +
        cp scylla-monitoring-scylla-monitoring-3.10.1/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/
        +cp scylla-monitoring-scylla-monitoring-3.10.1/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
        +
        +
        +
          +
        1. Edit the prometheus.yml file to point to the correct static data sources.

        2. +
        +
        +

        Note

        +

        Make sure to include the honor_labels: false parameter in the prometheus.yml file.

        +
        +
        vi /etc/prometheus/prometheus.yml
        +
        +
        +

        Set the alertmanger address and port by replacing AM_ADDRESS in the file.

        +

        For example if the alertmanager will run on the same host:

        +
        alerting:
        +   alertmanagers:
        +   - static_configs:
        +       - targets:
        +           - 127.0.0.1:9093
        +
        +
        +

        Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

        +

        For example the scrape config for Scylla:

        +
        global:
        +  scrape_interval: 5s # By default, scrape targets every 5 second.
        +  scrape_timeout: 4s # Timeout before trying to scape a target again
        +
        +  # Attach these labels to any time series or alerts when communicating with
        +  # external systems (federation, remote storage, Alertmanager).
        +  external_labels:
        +    monitor: 'scylla-monitor'
        +
        +scrape_configs:
        +- job_name: scylla
        +  honor_labels: false
        +  file_sd_configs:
        +    - files:
        +      - /etc/scylla.d/prometheus/scylla_servers.yml
        +  relabel_configs:
        +    - source_labels: [__address__]
        +      regex:  '([^:]+)'
        +      target_label: __address__
        +      replacement: '${1}:9180'
        +
        +    - source_labels: [__address__]
        +      regex:  '(.*):.+'
        +      target_label: instance
        +      replacement: '${1}'
        +
        +
        +
          +
        1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

        2. +
        +
        +

        Note

        +

        There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

        +
        +

        An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

        +
        +

        Note

        +

        You must have both files even if you are not using Scylla Manager

        +
        +

        Add the labels for the cluster and data-center

        +

        scylla_servers.yml:

        +

        For example:

        +
        cat scylla_servers.yml
        +# List Scylla end points
        +
        +- targets:
        +  - 192.168.66.6
        +  - 192.168.66.244
        +  labels:
        +    cluster: cluster1
        +    dc: dc1
        +- targets:
        +    - 172.17.0.3
        +  labels:
        +    cluster: cluster1
        +    dc: dc2
        +
        +
        +
        +

        Note

        +

        See the previous note about deprecating the node_exporter_servers.yml file.

        +
        +

        scylla_manager_server.yml

        +

        For example:

        +
        - targets:
        +  - 127.0.0.1:5090
        +
        +
        +
          +
        1. Start Prometheus server:

        2. +
        +

        For example:

        +
        cd scylla-monitoring-scylla-monitoring-3.10.1/
        +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
        +
        +
        +

        Data should start accumulate on: /prometheus/data

        +
          +
        1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

        2. +
        +

        For example:

        +
        http://192.168.135.166:9090/
        +
        +
        +../_images/1.png +

        Prometheus console should be visible

        +
          +
        1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

        2. +
        +

        For example:

        +

        node_memory_MemFree

        +../_images/2.png +

        And

        +

        scylla_reactor_utilization

        +../_images/3.png +

        At this point Scylla is emitting the metrics and Prometheus is able to store them.

        +
        +
        +

        Install Grafana

        +

        Tested with Grafna 7.5.7

        +
          +
        1. Install Grafana based on the instructions here

        2. +
        +

        Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

        +
          +
        1. Access Scylla-Grafana-monitoring directory

        2. +
        +
        cd scylla-monitoring-scylla-monitoring-3.10.1/
        +
        +
        +
          +
        1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

        2. +
        +
        sudo cp -r grafana/plugins /var/lib/grafana/
        +
        +
        +

        If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

        +

        For example:

        +
        cp -r grafana/plugins ../grafana-7.5.7/public/app
        +
        +
        +
          +
        1. Provision the Dashboards

        2. +
        +

        For example Scylla Open-source version 4.5 and Scylla manager version 2.4

        +

        For Grafana installed with yum install

        +
        sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
        +sudo mkdir -p /var/lib/grafana/dashboards
        +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
        +
        +
        +

        For Grafana installed from packages

        +
        cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
        +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
        +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
        +
        +
        +

        Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

        +
        +

        Note

        +

        A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

        +
        +
          +
        1. Set the data source by copy datasource.yml and edit it

        2. +
        +
        sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
        +
        +
        +
        +

        Note

        +

        Scylla uses a plugin to read from some system tables see the section below about using it.

        +
        +

        For Grafana installed from packages

        +
        cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
        +
        +
        +

        You should set the Prometheus and the alertmanager IP and port.

        +

        For example

        +
        sudo cat /etc/grafana/provisioning/datasources/datasource.yml
        +apiVersion: 1
        +datasources:
        + - name: prometheus
        +   type: prometheus
        +   url: http://192.168.135.167:9090
        +   access: proxy
        +   basicAuth: false
        +
        + - name: alertmanager
        +   type: camptocamp-prometheus-alertmanager-datasource
        +   orgId: 1
        +   typeLogoUrl: public/img/icn-datasource.svg
        +   access: proxy
        +   url: http://192.168.135.166:9093
        +   password:
        +   user:
        +   database:
        +   basicAuth:
        +   isDefault:
        +   jsonData:
        +     severity_critical: '4'
        +     severity_high: '3'
        +     severity_warning: '2'
        +     severity_info: '1'
        +
        +
        +
          +
        1. Start the Grafana service

        2. +
        +

        For Grafana installed with yum install

        +

        sudo service grafana-server start

        +

        For Grafana installed from packages:

        +

        cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

        +

        Edit scylla.ini to reflect the right paths in the paths section of the file.

        +
        plugins = /home/centos/grafana-7.5.7/data/plugins
        +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
        +
        +
        +

        Start the server:

        +
        cd /home/centos/grafana-7.5.7/
        +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
        +
        +
        +
          +
        1. Make sure Grafana is running

        2. +
        +

        Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

        +../_images/grafana.png +
        +
        +

        Using Scylla Plugin with Grafana

        +

        Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

        +

        Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

        +
        +

        Setting a monitoring user

        +

        This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

        +
          +
        • If you have not done so, enable authorization first.

        • +
        • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

        • +
        • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

        • +
        +
        +
        +

        Installing the Plugin

        +

        Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

        +
        +
        +

        Configure the Plugin

        +

        Add an entry to the datasource.yml file

        +
        - name: scylla-datasource
        +  type: scylladb-scylla-datasource
        +  orgId: 1
        +  isDefault:
        +  jsonData:
        +  host: ''
        +#  secureJsonData:
        +#    user: 'scylla_monitoring'
        +#    password: 'scylla_monitoring'
        +
        +
        +

        As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

        +
        +
        +

        Enable the Plugin

        +

        Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

        +

        See more about it the Grafana configurtion.

        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/monitoring_stack.html b/branch-3.10/install/monitoring_stack.html new file mode 100644 index 000000000..4779329c6 --- /dev/null +++ b/branch-3.10/install/monitoring_stack.html @@ -0,0 +1,1028 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Install Scylla Monitoring Stack

        +

        This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API

        +

        The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

        +

        For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

        +
        +

        Minimal Production System Recommendations

        +
          +
        • CPU - at least 2 physical cores/ 4vCPUs

        • +
        • Memory - 15GB+ DRAM and proportional to the number of cores.

        • +
        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

        • +
        • Network - 1GbE/10GbE preferred

        • +
        +
        +

        Calculating Prometheus Minimal Disk Space requirement

        +

        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

        +

        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

        +

        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

        +
        6 * 16 * 15 * 12MB ~ 16GB
        +
        +
        +

        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

        +
        +
        +

        Calculating Prometheus Minimal Memory Space requirement

        +

        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

        +

        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

        +
        +
        +
        +

        Prerequisites

        +
          +
        • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker .

        • +
        • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

        • +
        + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Scylla Monitoring Stack Compatibility Matrix

        Scylla Monitoring Stack Version

        Prometheus Version

        Grafana Version

        3.10

        2.32.0

        8.3.3

        3.9.2

        2.29.1

        8.2.7

        3.8

        2.27.1

        7.5.7

        3.7

        2.25.2

        7.4.0

        3.6

        2.18.1

        7.3.5

        3.5

        2.18.1

        7.1.5

        3.4

        2.18.1

        6.7.3

        +
        +
        +

        Docker Post Installation

        +

        Docker post installation guide can be found here

        +
        +

        Note

        +

        Avoid running the container as root.

        +
        +

        To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

        +
          +
        1. Create the Docker group.

        2. +
        +
        sudo groupadd docker
        +
        +
        +
          +
        1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

        2. +
        +
        sudo usermod -aG docker $USER
        +
        +
        +
          +
        1. Start Docker by calling:

        2. +
        +
        sudo systemctl enable docker
        +
        +
        +
        +
        +

        Install Scylla Monitoring Stack

        +

        Procedure

        +
          +
        1. Download and extract the latest Scylla Monitoring Stack binary;.

        2. +
        +
        wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.10.1.tar.gz
        +tar -xvf scylla-monitoring-3.10.1.tar.gz
        +cd scylla-monitoring-scylla-monitoring-3.10.1
        +
        +
        +

        As an alternative, you can clone and use the Git repository directly.

        +
        git clone https://github.com/scylladb/scylla-monitoring.git
        +cd scylla-monitoring
        +git checkout branch-3.10
        +
        +
        +
          +
        1. Start Docker service if needed

        2. +
        +
        sudo systemctl restart docker
        +
        +
        +
        +
        +

        Configure Scylla Monitoring Stack

        +

        To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

        +

        This configuration can be done from files, or using the Consul api.

        +

        Scylla Manager 2.0 and higher supports the Consul API.

        +
        +

        Configure Scylla nodes from files

        +
          +
        1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

        2. +
        +
        +

        Note

        +

        It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

        +
        +

        For example:

        +
        - targets:
        +      - 172.17.0.2
        +      - 172.17.0.3
        +  labels:
        +      cluster: cluster1
        +      dc: dc1
        +
        +
        +
        +

        Note

        +

        If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

        +
        +

        Using IPV6

        +

        To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

        +

        For example:

        +
        - targets:
        +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
        +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
        +  labels:
        +      cluster: cluster1
        +      dc: dc1
        +
        +
        +
        +

        Note

        +

        For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

        +
        +

        For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

        +
        +

        Note

        +

        By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

        +
        +

        If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

        +

        For example:

        +
        ./start-all.sh -s my_scylla_server.yml -d prometheus_data
        +
        +
        +

        Mark the different Data Centers with Labels.

        +

        As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

        +

        You can use the genconfig.py script to generate the server file. For example:

        +
        ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
        +
        +
        +

        This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

        +

        OR

        +

        The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

        +
        nodetool status | ./genconfig.py -NS
        +
        +
        +

        2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

        +

        You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

        +

        For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

        +
        # List Scylla Manager end points
        +
        +- targets:
        +  - 172.17.0.7:5090
        +
        +
        +

        Note that you do not need to add labels to the Scylla Manager targets.

        +
        +
        +

        Configure Scylla nodes using Scylla-Manager Consul API

        +

        Scylla Manager 2.0 has a Consul like API.

        +

        When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

        +

        For example:

        +
        ./start-all.sh -L 10.10.0.1
        +
        +
        +
        +

        Note

        +

        If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

        +
        +
        +
        +

        Connecting Scylla-Monitoring to Scylla

        +

        Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

        +

        You can limit the user to read only, currently it only read table from the system keyspace.

        +

        To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

        +

        Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

        +
        +
        +

        Use an external directory for the Prometheus data directory

        +

        The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

        +
        +

        Note

        +

        Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

        +
        +

        If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

        +

        In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

        +
        +
        +

        Add Additional Prometheus Targets

        +

        There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

        +

        The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

        +

        You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

        +
        - job_name: 'myservice'
        +  # Override the global default and scrape targets from this job every 5 seconds.
        +  scrape_interval: 5s
        +  static_configs:
        +    - targets:
        +      - 17.0.0.1:7000
        +
        +
        +
        +
        +
        +

        Start and Stop Scylla Monitoring Stack

        +
        +

        Start

        +
        ./start-all.sh -d prometheus_data
        +
        +
        +
        +
        +

        Stop

        +
        ./kill-all.sh
        +
        +
        +
        +
        +

        Start a Specific Scylla Monitoring Stack Version

        +

        By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

        +

        You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

        +

        Multiple versions are supported. For example:

        +
        ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
        +
        +
        +

        will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

        +
        +
        +

        Accessing the localhost

        +

        The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

        +
        ./start-all.sh -l -d prometheus-data
        +
        +
        +
        +
        +

        Configure rsyslog on each Scylla node

        +

        generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

        +

        Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

        +

        Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

        +

        If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

        +
        if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
        +
        +
        +

        Restart rsyslog for the configuration to take effect.

        +
        systemctl restart rsyslog
        +
        +
        +
        +
        +
        +

        View Grafana Dashboards

        +

        Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/start_all.html b/branch-3.10/install/start_all.html new file mode 100644 index 000000000..0a6ee40b0 --- /dev/null +++ b/branch-3.10/install/start_all.html @@ -0,0 +1,756 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        The start-all.sh command

        +

        Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

        +

        The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

        +
        +

        General Options

        +

        -h Help, Print the help, and exit.

        +

        –version print the current Scylla-Monitoring stack version, and exit.

        +

        -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

        +

        -A bind-to-ip-address Bind the listening-address to an explicit IP address.

        +

        -D encapsulate docker param Allows passing additional parameters to all the docker containers.

        +

        –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

        +
        + + +
        +

        Alert Manager

        +

        alertmanager handles the alerts and takes the following parameters:

        +

        -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

        +

        -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

        +

        -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/thanos.html b/branch-3.10/install/thanos.html new file mode 100644 index 000000000..1f2dd95dc --- /dev/null +++ b/branch-3.10/install/thanos.html @@ -0,0 +1,759 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Using Thanos as Data Source With Scylla Monitoring Stack

        +

        Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

        +
          +
        • High-availability.

        • +
        • Horizontal scaling.

        • +
        • Backup.

        • +
        +

        The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

        +

        The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

        +
        +

        Using Thanos As a Prometheus Aggregator

        +

        There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

        +
        +

        Prometheus Configuration

        +

        We will assume you have two Prometheus servers running.

        +
          +
        1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

        2. +
        3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

        4. +
        +
        +
        +

        Thanos sidecar

        +

        The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

        +
        docker run -d \
        + -v /path/to/prom/dir:/data/prom:z \
        + -i --name sidecar thanosio/thanos \
        + sidecar \
        + --grpc-address=0.0.0.0:10911 \
        + --grpc-grace-period=1s \
        + --http-address=0.0.0.0:10912 \
        + --http-grace-period=1s \
        + --prometheus.url=http://prometheus-ip:9090 \
        + --tsdb.path=/data/prom \
        + -p 10912:10912 \
        + -p 10911:10911
        +
        +
        +

        After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

        +
        +
        +

        Thanos query

        +

        Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

        +
        docker run -d \
        + --name thanos -- thanosio/thanos \
        +   query \
        +   --debug.name=query0 \
        +   --log.level=debug \
        +   --grpc-address=0.0.0.0:10903 \
        +   --grpc-grace-period=1s \
        +   --http-address=0.0.0.0:10904 \
        +   --http-grace-period=1s \
        +   --query.replica-label=prometheus \
        +   --store={ip1}:10911 --store={ip2}:10911
        +
        +
        +

        After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

        +
        +
        +

        Update Scylla Data source

        +

        The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

        +

        The file you edit is a template file that replaces the file Grafana uses, next time you start.

        +

        Restart the Scylla Monitoring Stack it should now use Thanos.

        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/intro.html b/branch-3.10/intro.html new file mode 100644 index 000000000..278e3e014 --- /dev/null +++ b/branch-3.10/intro.html @@ -0,0 +1,709 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack

        +

        Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

        +_images/monitor.png +

        The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers:

        +
          +
        • prometheus - Collects and stores metrics

        • +
        • grafan-loki - Parses logs and generates metrics and alerts

        • +
        • alertmanager - Handles alerts

        • +
        • grafana - Dashboards server

        • +
        +

        A few optional components are used for additional services

        +
          +
        • grafana-image-renderer - Allows you to download a dashboard as an image.

        • +
        • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

        • +
        +
        +

        High Level Architecture

        +_images/monitoring_stack1.png +

        We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the node_exporter agent that runs on the Scylla server.

        +

        We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers.

        +

        The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

        +

        We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL.

        +

        Choose a topic to get started:

        + +

        For older versions of Scylla Monitoring Stack Documentation see here.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/objects.inv b/branch-3.10/objects.inv new file mode 100644 index 000000000..dab198fbb Binary files /dev/null and b/branch-3.10/objects.inv differ diff --git a/branch-3.10/procedures/alerts/alerting.html b/branch-3.10/procedures/alerts/alerting.html new file mode 100644 index 000000000..7e1afbf46 --- /dev/null +++ b/branch-3.10/procedures/alerts/alerting.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Alerting

        +

        Alerts are a Prometheus enhancement to notify that something is wrong in the system.

        +

        You can read more about Prometheus alerting here

        +

        By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

        +

        In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

        +

        The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

        +../../_images/monitoring_stack.png +
        +

        Prometheus Alerts

        +

        The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

        +

        Each alert consists of:

        +
          +
        • Name

        • +
        • What happened

        • +
        • For how long

        • +
        • What to report

        • +
        +

        For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

        +
        - alert: InstanceDown
        +  expr: up == 0
        +  for: 60s
        +  labels:
        +    severity: "2"
        +  annotations:
        +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
        +    summary: Instance {{ $labels.instance }} down
        +
        +
        +

        The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

        +

        The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

        +

        The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

        +

        annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

        +
        +
        +

        Alertmanager

        +

        The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

        +

        The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

        +
          +
        • Routes: Represent a routing tree, the most specific rule, wins

        • +
        • Inhibition: Mute an alert, based on another alert

        • +
        • Receiver: Send a notification via email, sluck, etc’

        • +
        +

        Check the Alertmanager documentation for details on how to specify a specific receiver.

        +

        In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

        +
        +
        +

        Tips When Adding an Alert

        +

        It’s worse having an alert that does not work, than not having an alert at all

        +

        There are multiple ways you can use to make sure your alert is set correctly:

        +
          +
        • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

        • +
        • Force the alert to be active by reducing the limits or the duration.

        • +
        • When possible simulate the actual scenario and see that the alert works as expected.

        • +
        +

        For example, low available disk space.

        +

        Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

        +

        Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

        +

        Starting with a simple working expression helps you bisect problems.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/procedures/alerts/index.html b/branch-3.10/procedures/alerts/index.html new file mode 100644 index 000000000..a5d8da5b5 --- /dev/null +++ b/branch-3.10/procedures/alerts/index.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Alert Manager

        +
        +
        +

        Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/procedures/index.html b/branch-3.10/procedures/index.html new file mode 100644 index 000000000..5215733c3 --- /dev/null +++ b/branch-3.10/procedures/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Procedures

        +
        +
        +

        There are several reference guides available which give additional information. Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/procedures/updating_dashboard.html b/branch-3.10/procedures/updating_dashboard.html new file mode 100644 index 000000000..f751caf59 --- /dev/null +++ b/branch-3.10/procedures/updating_dashboard.html @@ -0,0 +1,964 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Adding and Modifying Dashboards

        +

        This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

        +

        It covers dashboard templates and how to modify them.

        + +
        +

        General Limitations

        +

        Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

        +
        +

        Consistency Between Restarts

        +

        By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

        +
        +
        +

        Consistency Between Upgrades

        +

        As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

        +
        +

        Note

        +

         You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

        +
        +

        At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

        +
        +
        +
        +

        Using Templated Dashboards

        +

        Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

        +

        Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

        +

        For example a typical graph panel would look like this:

        +
        {
        +    "aliasColors": {},
        +    "bars": false,
        +    "datasource": "prometheus",
        +    "editable": true,
        +    "error": false,
        +    "fill": 0,
        +    "grid": {
        +        "threshold1": null,
        +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
        +        "threshold2": null,
        +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
        +    },
        +    "gridPos": {
        +        "h": 6,
        +        "w": 10,
        +        "x": 0,
        +        "y": 4
        +    },
        +    "id": 2,
        +    "isNew": true,
        +    "legend": {
        +        "avg": false,
        +        "current": false,
        +        "max": false,
        +        "min": false,
        +        "show": false,
        +        "total": false,
        +        "values": false
        +    },
        +    "lines": true,
        +    "linewidth": 2,
        +    "links": [],
        +    "nullPointMode": "connected",
        +    "percentage": false,
        +    "pointradius": 5,
        +    "points": false,
        +    "renderer": "flot",
        +    "seriesOverrides": [
        +        {}
        +    ],
        +    "span": 5,
        +    "stack": false,
        +    "steppedLine": false,
        +    "targets": [
        +        {
        +            "expr": "sum(node_filesystem_avail) by (instance)",
        +            "intervalFactor": 1,
        +            "legendFormat": "",
        +            "refId": "A",
        +            "step": 1
        +        }
        +    ],
        +    "timeFrom": null,
        +    "timeShift": null,
        +    "title": "Available Disk Size",
        +    "tooltip": {
        +        "msResolution": false,
        +        "shared": true,
        +        "sort": 0,
        +        "value_type": "cumulative"
        +    },
        +    "transparent": false,
        +    "type": "graph",
        +    "xaxis": {
        +        "show": true
        +    },
        +    "yaxes": [
        +        {
        +            "format": "percent",
        +            "logBase": 1,
        +            "max": 101,
        +            "min": 0,
        +            "show": true
        +        },
        +        {
        +            "format": "short",
        +            "logBase": 1,
        +            "max": null,
        +            "min": null,
        +            "show": true
        +        }
        +    ]
        +}
        +
        +
        +

        As you can imagine, most panels would have similar values.

        +

        To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

        +
        +

        The Template Class System

        +

        The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

        +

        The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

        +

        In the template file, you can also add or override attributes.

        +

        The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

        +

        When generating dashboards, each class will be replaced by its definition.

        +

        For example, a row in the type.json is defined as:

        +
        {
        + "base_row": {
        +     "collapse": false,
        +     "editable": true
        + },
        + "row": {
        +     "class": "base_row",
        +     "height": "250px"
        + }
        + }
        +
        +
        +

        Will be used like in a template:

        +
        {
        +     "class": "row",
        +     "height": "150px",
        +     "panels": [
        +     ]
        +}
        +
        +
        +

        And the output will be:

        +
        {
        +     "class": "row",
        +     "collapse": false,
        +     "editable": true,
        +     "height": "150px",
        +     "panels": [
        +
        +     ]
        +}
        +
        +
        +

        We can see that the template added the panels attribute and that it overrides the height attribute.

        +
        +
        +

        Panel Example

        +

        Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

        +
        {
        +     "class": "row",
        +     "panels": [
        +         {
        +             "class": "bytes_panel",
        +             "span": 3,
        +             "targets": [
        +                 {
        +                     "expr": "sum(node_filesystem_avail) by (instance)",
        +                     "intervalFactor": 1,
        +                     "legendFormat": "",
        +                     "metric": "",
        +                     "refId": "A",
        +                     "step": 1
        +                 }
        +             ],
        +             "title": "Available Disk Size"
        +         }
        +     ]
        +}
        +
        +
        +

        In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

        +

        You can also see that the span attribute is overridden to set the panel size.

        +

        To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

        +
        +
        +

        Grafana Formats and Layouts

        +

        The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

        +

        Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

        +

        The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

        +

        To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

        +

        The panel’s height will be taken from their row. The span attribute is still supported as is row height.

        +

        You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

        +

        gridPos has the following attributes:

        +
        {
        +   "x": 0,
        +   "y": 0,
        +   "w": 24,
        +   "h": 4
        + }
        +
        +
        +

        When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

        +
        {
        +   "gridPos": {
        +      "h": 2
        +    }
        +}
        +
        +
        +
        +
        +

        Generating the dashboards from templates (generate-dashboards.sh)

        +
        +

        Prerequisite

        +

        Python 2.7

        +

        make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

        +

        Use the -h flag to get help information.

        +

        You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

        +

        When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

        +

        For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

        +

        .\generate-dashboards.sh -v 2020.1

        +
        +

        Note

        +

        generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

        +
        +
        +
        +
        +

        Validation

        +

        After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

        +

        Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/reference/index.html b/branch-3.10/reference/index.html new file mode 100644 index 000000000..5410e77bb --- /dev/null +++ b/branch-3.10/reference/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Reference Guide

        +
        +
        +

        There are several reference guides available which give additional information. Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/reference/matrix.html b/branch-3.10/reference/matrix.html new file mode 100644 index 000000000..1ebabf597 --- /dev/null +++ b/branch-3.10/reference/matrix.html @@ -0,0 +1,806 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Support Matrix

        +

        The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

        + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        Scylla Monitoring Stack Version

        Scylla Open Source Version

        Scylla Enterprise Version

        Node_exporter[1] Version

        Scylla Manager Version

        3.10

        4.3, 4.4, 4.5, 4.6

        2020.1, 2021.1

        0.17

        2.3, 2.4, 2.5, 2.6

        3.9

        4.3, 4.4, 4.5, 4.6

        2020.1, 2021.1

        0.17

        2.3, 2.4, 2.5

        3.8

        4.3, 4.4, 4.5

        2020.1, 2021.1

        0.17

        2.3, 2.4, 2.5

        3.7

        4.2, 4.3, 4.4

        2019.1, 2020.1, 2021.1

        0.17

        2.2, 2.3

        3.6.3

        4.2, 4.3, 4.4

        2019.1, 2020.1, 2021.1

        0.17

        2.2, 2.3, 2.1

        3.6

        4.1, 4.2, 4.3

        2019.1, 2020.1

        0.17

        2.1, 2.2, 2.3

        3.6.1

        4.1, 4.2, 4.3

        2019.1, 2020.1

        0.17

        2.1, 2.2

        3.6.1

        4.1, 4.2, 4.3, 4.4

        2019.1, 2020.1

        0.17

        2.1, 2.2

        3.5

        3.3, 4.0, 4.1, 4.2

        2019.1, 2020.1

        0.17

        2.0, 2.1, 2.2

        3.4.3

        3.3, 4.0, 4.1, 4.2

        2019.1, 2020.1

        0.17

        2.0, 2.1

        3.4

        3.3, 4.0, 4.1

        2018.1, 2019.1

        0.17

        2.0, 2.1

        3.3

        3.1, 3.2, 3.3, 4.0

        2018.1, 2019.1

        0.17

        1.4, 2.0, 2.1

        3.2

        3.1, 3.2, 3.3

        2018.1, 2019.1

        0.17

        1.4, 2.0

        3.1

        2.3, 3.0, 3.1, 3.2

        2018.1, 2019.1

        0.17

        1.3, 1.4, 2.0

        3.0

        2.3, 3.0, 3.1, 3.2

        2018.1, 2019.1

        0.17

        1.3, 1.4

        2.4

        2.3, 3.0, 3.1

        2018.1, 2019.1

        0.14, 0.17

        1.3, 1.4

        2.3

        2.3, 3.0

        2018.1, 2019.1

        0.14, 0.17

        1.3

        2.2

        2.3, 3.0

        2018.1, 2019.1

        0.14, 0.17

        1.3

        2.1

        2.3, 3.0

        2018.1

        0.14, 0.17

        1.3

        +

        [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/reference/monitoring_apis.html b/branch-3.10/reference/monitoring_apis.html new file mode 100644 index 000000000..f7993a688 --- /dev/null +++ b/branch-3.10/reference/monitoring_apis.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Interfaces

        +

        Scylla exposes two interfaces for online monitoring, as described below

        +
        +

        Prometheus

        +

        By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

        +

        For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

        +

        You can change the Prometheus listening address and port in scylla.yaml file

        +
        # prometheus port
        +# By default, Scylla opens prometheus API port on port 9180
        +# setting the port to 0 will disable the prometheus API.
        +prometheus_port: 9180
        +#
        +# prometheus address
        +# By default, Scylla binds all interfaces to the prometheus API
        +# It is possible to restrict the listening address to a specific one
        +prometheus_address: 0.0.0.0
        +
        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/robots.txt b/branch-3.10/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.10/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.10/search.html b/branch-3.10/search.html new file mode 100644 index 000000000..1a2b5a6db --- /dev/null +++ b/branch-3.10/search.html @@ -0,0 +1,651 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + + + +
        + + + + + +
        + + +
        + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/searchindex.js b/branch-3.10/searchindex.js new file mode 100644 index 000000000..3a1413b25 --- /dev/null +++ b/branch-3.10/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "Scylla Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Scylla Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], "10": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], "1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], "scylla": [0, 2, 4, 7, 10, 13, 24, 25, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39], "monitor": [0, 2, 4, 7, 10, 13, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39], "stack": [0, 2, 4, 7, 10, 13, 21, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 18, 20, 22, 24, 25, 26, 27, 30, 31, 32, 33, 35, 37, 38, 39], "full": [0, 1, 3, 6, 9, 10, 24], "alert": [0, 1, 3, 5, 6, 9, 12], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 15, 18, 20, 22, 33, 35, 37], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 13, 20, 27, 37, 39], "open": [0, 1, 3, 5, 6, 9, 15, 16, 19], "sourc": [0, 1, 3, 5, 6, 9, 10, 15, 19, 20, 37], "tool": [0, 1, 3, 9, 18, 39], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 13, 15, 18, 21, 22, 23, 39], "grafana": [0, 1, 3, 8, 9, 10, 21, 23], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 12, 15, 18, 21, 22, 23, 32, 39, 40], "consist": [1, 9, 10, 20, 32], "three": [1, 6, 10], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 18, 20], "collect": [1, 5, 6, 7, 8, 9, 22, 33, 35], "store": [1, 5, 8, 9, 13, 21, 23, 25, 26, 37], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 13, 15, 20, 21, 22, 23, 39], "alertmanag": [1, 2, 7, 9, 21, 23], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 16, 20, 24, 39], "choos": [1, 3, 9, 11, 12, 14, 17, 18, 40], "topic": [1, 3, 9, 11, 12, 14, 17, 40], "get": [1, 6, 8, 9, 10, 13, 25, 32, 36, 37, 38, 39], "start": [1, 3, 5, 8, 9, 10, 13, 20, 21, 22, 23, 31], "user": [1, 2, 6, 7, 9, 24, 39], "guid": [1, 6, 9, 12, 18, 19], "download": [1, 5, 6, 9, 20, 21, 22, 23], "instal": [1, 2, 9, 18], "procedur": [1, 5, 6, 9, 18, 19], "troubleshoot": [1, 9, 30], "refer": [1, 6, 9, 12], "upgrad": [1, 12], "lesson": [1, 9, 26, 27], "univers": [1, 9], "github": [1, 5, 6, 21, 23], "project": 1, "For": [1, 2, 4, 5, 6, 7, 9, 10, 13, 16, 18, 20, 32, 33, 36, 39], "older": [1, 9, 22, 23], "version": [1, 2, 5, 7, 9, 13, 15, 18], "document": [1, 5, 6, 8, 9, 10, 13, 18, 20, 21, 22, 23], "see": [1, 2, 4, 5, 6, 9, 10, 13, 16, 18, 20, 21, 22, 23, 39], "here": [1, 5, 6, 7, 9, 10, 20], "base": [2, 5, 6, 7, 8, 9, 10, 13, 24, 39], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 20, 21, 22, 23, 27, 29, 31, 32, 38, 39, 40], "can": [2, 5, 6, 7, 8, 10, 13, 16, 18, 20, 21, 22, 23, 24, 27, 31, 32, 39, 40], "all": [2, 3, 5, 6, 8, 10, 13, 16, 18, 20, 22, 24, 28, 32, 39], "sh": [2, 3, 6, 18, 20, 21, 22, 23], "kill": [2, 6, 18, 20, 22], "script": [2, 3, 6, 7, 13, 22], "an": [2, 4, 5, 7, 8, 9, 13, 18, 20, 22, 29, 30, 32, 33, 35, 37, 39], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 13, 16, 20], "requir": [2, 8, 25, 28, 33, 39], "more": [2, 4, 5, 6, 10, 13, 16, 18, 24, 27, 30, 33, 36, 39], "manual": [2, 18], "step": [2, 5, 8, 13, 18, 20, 21, 22, 23], "onc": [2, 20, 29, 37, 39], "configur": [2, 7, 10, 13, 16, 18, 20, 32], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 20, 21, 22, 23, 31, 32, 33, 34, 37, 38, 39, 40], "two": [2, 6, 7, 8, 13, 16, 20, 23, 31, 32, 37, 39], "wai": [2, 5, 7, 10, 18, 30, 39], "launch": 2, "should": [2, 4, 5, 6, 8, 13, 18, 20, 22, 23, 24, 25, 28, 29, 30, 36, 39], "one": [2, 6, 7, 16, 20, 21, 22, 23, 25, 27, 28, 31, 32, 33, 39], "both": [2, 5, 6, 18, 21, 23, 39], "In": [2, 6, 10, 13, 18, 20, 31, 39], "particular": 2, "creat": [2, 5, 6, 7, 10, 13, 18, 24, 37, 39], "updat": [2, 5, 13, 18, 20], "yml": [2, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 31, 39], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 13, 18, 20, 21, 23, 26, 31, 32, 33, 38, 39], "make": [2, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 32, 39], "sure": [2, 5, 6, 8, 10, 13, 18, 20, 21, 22, 23, 39], "have": [2, 4, 5, 6, 7, 8, 10, 13, 18, 23, 31], "among": [2, 32], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 16, 18, 20, 21, 23], "address": [2, 5, 6, 7, 8, 16, 18, 20], "either": [2, 6], "locat": [2, 7, 10, 20, 22, 32], "scylla_serv": [2, 5, 6, 18, 20, 21, 22, 23, 39], "consul": [2, 7], "manag": [2, 5, 12, 15, 17], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 39], "exampl": [2, 4, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 32, 33, 39], "product": [2, 7], "system": [2, 7, 9, 10, 11, 21, 23, 25, 31, 32, 39], "advis": [2, 32], "extern": [2, 5, 7, 8, 10, 13, 18, 21, 23, 39], "directori": [2, 5, 7, 8, 10, 13, 20, 21, 22, 23], "databas": [2, 5, 7, 20, 27, 39], "accordingli": 2, "below": [2, 5, 6, 10, 13, 16], "read": [2, 5, 6, 8, 9, 10, 18, 20, 24, 28], "its": [2, 5, 6, 7, 8, 9, 13, 20], "from": [2, 5, 7, 8, 9, 10, 18, 20, 21, 22, 23, 24, 30, 34, 39], "note": [2, 5, 6, 7, 18, 20, 21, 23], "latter": 2, "tell": 2, "where": [2, 5, 6, 13, 18, 20, 39], "themselv": [2, 13], "which": [2, 8, 12, 13, 14, 15, 30, 33, 35, 37, 39], "differ": [2, 5, 6, 7, 8, 13, 20, 21, 22, 23, 29, 30, 39], "run": [2, 3, 5, 6, 7, 8, 9, 13, 15, 18, 20, 22, 31, 38], "follow": [2, 4, 5, 6, 7, 13, 15, 18, 20, 21, 23, 39], "command": [2, 6, 8, 18, 20, 21, 23], "datasourc": [2, 5, 6, 8, 13], "under": [2, 5, 6], "yaml": [2, 5, 6, 16], "To": [2, 4, 5, 6, 13, 16, 20, 21, 22, 23], "sashboard": 2, "t": [2, 13], "line": [2, 5, 6, 7, 8, 13, 20], "flag": [2, 6, 7, 8, 13, 18, 20, 21, 23], "v": [2, 6, 7, 8, 13, 18], "specifi": [2, 6, 7, 10, 13, 18, 20], "enterpris": [2, 6, 13, 15], "2020": [2, 6, 13, 15], "thi": [2, 4, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 24, 25, 28, 31, 32, 34, 38, 39], "your": [2, 5, 6, 7, 8, 10, 11, 13, 16, 18, 20, 21, 23, 25, 26, 27, 39], "pass": [2, 6, 7, 20], "call": [2, 6, 7], "servic": [2, 5, 6, 7, 9, 18], "container_nam": 2, "aalert": 2, "imag": [2, 9, 18], "prom": [2, 8, 18], "v0": [2, 5], "21": 2, "0": [2, 5, 6, 7, 8, 10, 13, 15, 16, 20, 21, 22, 23], "port": [2, 5, 6, 7, 16, 18, 20, 21, 23], "9093": [2, 5], "volum": [2, 4, 5, 6, 21, 23], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 13], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 13, 22], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "scylladb": [2, 5, 6, 21, 23, 27, 28, 30, 33, 35, 36], "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 13], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 13, 15], "5": [2, 5, 6, 13, 15, 18], "3000": [2, 5, 6, 21, 23], "1000": 2, "build": [2, 5], "plugin": 2, "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 13, 26, 33, 35, 39], "path": [2, 5, 6, 7, 8, 10, 20, 21, 22, 23], "dir": [2, 7, 8, 21, 23], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 7, 10, 13, 15, 19, 23, 33], "3100": [2, 5], "rule": [2, 5, 7, 10, 29, 38], "conf": [2, 5, 6], "promotheu": 2, "aprom": [2, 18], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 18], "d": [2, 5, 6, 7, 8, 20, 21, 22, 23], "scylla_manager_serv": [2, 5, 6, 18, 20, 22, 23], "node_exporter_serv": [2, 5, 6, 20, 21], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 18, 20, 39], "down": [2, 10, 18, 20, 21, 23, 25, 33], "begin": [3, 11, 12, 14, 17, 40], "deploi": [3, 6], "without": [3, 6, 7, 13, 20], "us": [3, 4, 7, 9, 10, 11, 18, 20, 21, 22, 23, 27, 32, 33, 35, 37, 39], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 38], "least": [4, 5, 6], "physic": [4, 5, 6], "core": [4, 5, 6], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 21, 23, 33, 37], "storag": [4, 5, 6, 7, 9, 13], "retent": [4, 5, 6, 20], "period": [4, 5, 6, 8, 10, 20, 31, 37], "section": [4, 5, 6, 18, 20, 23, 39], "network": [4, 5, 6, 7, 18], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 18], "perform": [4, 5, 6, 31, 32, 36, 39], "block": [4, 5, 6], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 27, 33, 35, 39], "default": [4, 5, 6, 7, 10, 13, 16, 18, 20, 22, 28, 39], "15": [4, 5, 6, 20], "dai": [4, 5, 6, 7, 20], "around": [4, 5, 6, 18], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 39], "assum": [4, 5, 6, 7, 8, 10, 21, 23], "scrape": [4, 5, 6], "interv": [4, 5, 6], "20": [4, 5, 6, 36], "6": [4, 5, 6, 13, 15], "node": [4, 5, 7, 15, 18, 20, 25, 26, 27, 32, 33, 35, 36, 39], "cluster": [4, 5, 6, 30, 39], "each": [4, 5, 7, 8, 9, 10, 13, 15, 18, 25, 27, 32, 37, 39], "16": [4, 5, 6, 18], "so": [4, 5, 6, 7, 8, 10, 13, 18, 20, 27, 39], "total": [4, 5, 6, 8, 13], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 20, 22, 29, 37, 39], "need": [4, 5, 6, 7, 8, 13, 18, 25, 26, 27, 38, 39], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 13, 18, 34, 38, 39], "replac": [4, 5, 6, 8, 13, 21, 23], "ad": [4, 5, 6, 7, 12], "we": [4, 5, 6, 8, 9, 13, 21, 23, 39], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 13, 18, 20, 25, 31, 39], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 13, 18, 37, 39], "fast": [4, 5, 6, 38], "enough": [4, 5, 6, 38], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 13, 18, 20, 25, 32, 39], "out": [4, 5, 6, 8, 38], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 32, 33, 35], "over": [4, 5, 6], "longer": [4, 5, 6, 13, 20, 22], "durat": [4, 5, 6, 10], "e": [4, 5, 6, 13], "g": [4, 5, 6, 7, 20, 21, 23], "look": [4, 5, 6, 8, 10, 13, 39], "week": [4, 5, 6, 7], "view": [4, 5], "would": [4, 5, 6, 8, 10, 13, 20, 24, 27, 31, 39], "take": [4, 5, 6, 7, 13, 18, 20], "than": [4, 5, 6, 10, 13, 20, 39], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 32], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 18, 22, 33], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 13, 16, 20, 39], "swap": [4, 5, 6], "crash": [4, 5, 6], "instruct": [5, 6, 21, 23], "help": [5, 7, 10, 13, 39], "pleas": [5, 18], "most": [5, 10, 13, 32, 34, 39], "current": [5, 6, 7, 10, 13, 18, 21, 23], "common": [5, 7, 39], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 18], "standalon": 5, "thei": [5, 7, 10, 13, 36, 37], "alreadi": [5, 21, 23], "consolid": 5, "componen": 5, "suggest": [5, 13], "those": [5, 31], "offici": 5, "also": [5, 6, 7, 8, 10, 13], "main": [5, 20, 37], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 25, 39], "data": [5, 7, 9, 10, 13, 20, 21, 22, 23, 24, 25, 26, 27, 32, 33, 35, 36, 38, 39], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 18], "befor": [5, 6, 10, 20, 21, 22, 23, 25, 26, 33, 39], "support": [5, 6, 13, 14, 24, 30, 39], "want": [5, 6, 10, 21, 23], "latest": [5, 6, 7, 21, 23], "releas": [5, 20, 21, 22, 23], "tightli": 5, "compat": [5, 13, 18, 20, 22], "matrix": [5, 14], "cento": [5, 18], "instanc": [5, 6, 10, 13], "wget": [5, 6, 21, 23], "http": [5, 6, 8, 18, 20, 21, 23, 27, 28, 30, 36], "com": [5, 6, 21, 23, 27, 28, 30, 36], "archiv": [5, 6, 21, 23], "ref": 5, "tag": 5, "tar": [5, 6, 21, 23], "gz": [5, 6], "xvf": [5, 6], "test": [5, 18, 21, 39], "22": [5, 13], "linux": 5, "amd64": 5, "copi": [5, 20, 21, 22, 23], "file": [5, 7, 8, 10, 13, 16, 20, 22], "cp": [5, 21, 22, 23], "p": [5, 7, 8, 18, 20, 21, 23], "home": 5, "cd": [5, 6, 21, 23], "verifi": [5, 22], "point": [5, 6, 13, 21, 23], "browser": [5, 6, 8, 13, 18, 21, 23], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 18], "aggreg": 5, "inspir": 5, "central": [5, 9], "check": [5, 10, 18, 21, 23, 34, 35, 39], "recomand": 5, "local": [5, 6, 7, 8, 9, 13, 18, 21, 23, 39], "describ": [5, 6, 8, 16, 18, 39], "respons": [5, 10], "pars": [5, 9, 13, 29, 39], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 33, 35], "load": [5, 6, 18, 24, 27, 28, 39], "multipl": [5, 6, 7, 8, 9, 10, 13, 25, 28, 29, 36, 38, 39], "do": [5, 6, 7, 13, 18, 20, 21, 22, 23, 27, 39], "rsyslog": [5, 9], "second": [5, 6, 10, 18, 20, 21, 23], "relat": [5, 39], "modifi": [5, 12], "mkdir": 5, "templat": [5, 6, 8, 18, 20, 39], "edit": [5, 6, 7, 8, 13, 18], "localhost": [5, 7], "loki_ip": 5, "": [5, 6, 7, 9, 10, 13, 24, 25, 34, 37, 39], "27": [5, 6, 13], "If": [5, 6, 7, 8, 13, 18, 20, 22, 34, 36, 37, 38, 39], "besid": [5, 7, 20, 39], "expect": [5, 10, 21, 23], "scrap": 5, "job": [5, 6, 18], "onli": [5, 6, 7, 20, 22, 27, 29, 37, 39], "import": [5, 6, 7, 20, 21, 23, 31], "record": 5, "asspect": 5, "work": [5, 6, 7, 8, 10, 13, 20, 21, 23], "code": [5, 32], "shell": 5, "prom_rul": 5, "correct": [5, 22], "static": [5, 31], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 20, 30], "host": [5, 6, 7, 9, 18], "static_config": [5, 6], "target": [5, 7, 13, 16, 18, 20, 22], "127": [5, 7, 18], "right": [5, 6, 13, 32, 39], "typic": [5, 13, 25, 27, 37, 39], "node_export": [5, 6, 7, 9, 15, 18], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 13, 16, 20, 22, 28, 39], "everi": [5, 6, 7], "scrape_timeout": 5, "4": [5, 6, 13, 15], "timeout": [5, 38], "try": [5, 18], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10], "ani": [5, 6, 10, 13, 18, 32, 39], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 20], "scrape_config": [5, 20], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 16, 18], "There": [5, 6, 8, 10, 12, 13, 14, 36, 38, 40], "instead": [5, 6, 8, 39], "found": [5, 6, 7, 10, 13], "must": [5, 6, 33], "even": [5, 6, 7], "center": [5, 6, 8, 39], "cat": 5, "list": [5, 6], "end": [5, 6, 20, 39], "66": [5, 18], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8], "dc1": [5, 6], "172": [5, 6, 18], "17": [5, 6, 15, 18, 22], "dc2": [5, 6], "previou": [5, 23], "deprec": 5, "5090": [5, 6, 18], "tsdb": [5, 7, 8], "accumul": 5, "consol": [5, 18], "visibl": 5, "execut": [5, 24, 29], "through": 5, "node_memory_memfre": 5, "And": [5, 13, 21, 23], "scylla_reactor_util": 5, "At": [5, 13, 23], "emit": 5, "abl": [5, 8, 20, 22], "them": [5, 7, 9, 10, 13, 22, 32], "grafna": 5, "depend": [5, 8], "repositori": [5, 6], "yum": 5, "zip": [5, 21, 23], "structur": 5, "rest": [5, 8], "access": [5, 7], "sudo": [5, 6, 18], "r": [5, 7, 13, 18], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 13, 18], "provis": [5, 6, 13], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 13, 25, 26, 33, 37, 39], "folder": 5, "name": [5, 6, 8, 10, 18, 22, 39], "otherwis": 5, "some": [5, 8, 10, 32, 36], "tabl": [5, 6, 10, 15, 24, 32, 39], "apivers": 5, "type": [5, 13, 39], "url": [5, 8, 20], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 32, 40], "connect": [5, 8, 13, 16, 18], "between": [5, 8, 18, 20, 21, 23, 32, 39], "give": [5, 12, 14], "strongli": 5, "encourag": 5, "restrict": [5, 16], "keyspac": [5, 6], "part": [5, 6, 10, 22, 24, 27, 32, 39], "option": [5, 6, 8, 9, 18, 20, 31], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 13, 20], "detail": [5, 10, 32], "done": [5, 6, 7, 13, 18], "first": [5, 21, 23, 39], "new": [5, 6, 18, 37], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 39], "AND": 5, "login": [5, 6, 18], "proper": [5, 18], "select": [5, 32, 39], "permiss": [5, 6, 20], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 13, 29], "mention": [5, 13], "previous": [5, 23], "safer": [5, 39], "dedic": [5, 6], "limit": [5, 6, 8, 10, 28, 31, 39], "privileg": [5, 7], "un": 5, "comment": 5, "relev": [5, 7, 32], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 18], "evalu": 6, "laptop": 6, "32": 6, "8": [6, 15, 20], "9": [6, 15], "29": 6, "25": [6, 18], "avoid": [6, 13, 18, 28, 30, 39], "root": [6, 18, 21, 23], "go": [6, 18], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 21, 23], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 18, 20], "extract": 6, "binari": [6, 18], "clone": 6, "git": 6, "directli": [6, 9], "checkout": 6, "restart": [6, 7, 8, 20], "know": [6, 18, 27, 39], "higher": [6, 27, 39], "wish": [6, 7], "match": [6, 39], "datacent": 6, "nodetool": 6, "statu": [6, 18], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 20], "listen": [6, 7, 16, 20], "set": [6, 7, 10, 13, 16], "inform": [6, 7, 12, 13, 14, 16, 24, 25, 26], "agent": [6, 7, 8, 9, 15, 18], "machin": [6, 7, 18, 22], "overrid": [6, 7, 13], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 13], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 18, 21, 23], "within": [6, 10, 13], "protect": 6, "assign": 6, "place": [6, 7, 8, 13, 39], "outsid": [6, 7, 20], "result": [6, 7, 20, 25, 27, 28, 37, 39], "lost": [6, 7, 13, 39], "exist": [6, 13, 39], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 31, 39], "firewal": [6, 18], "7000": [6, 18], "myservic": 6, "m": [6, 7, 20, 21, 23], "2019": [6, 15, 36], "reach": [6, 8, 27, 33, 39], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 27, 28, 33, 35, 39], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 13, 18], "authent": [6, 7], "disabl": [6, 16], "simplest": 7, "small": [7, 37], "util": [7, 13, 22], "appropri": 7, "h": [7, 13], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 33, 38], "map": 7, "bind": [7, 16], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 20, 26, 29, 32], "addit": [7, 8, 9, 10, 12, 14, 39], "auto": 7, "automat": 7, "failur": [7, 18, 38], "gui": [7, 13, 18], "keep": [7, 20], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "specif": [7, 10, 16, 18, 34, 39], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 13], "mean": [7, 13, 20, 24, 25, 26, 27, 28, 33, 35, 39], "chang": [7, 13, 16, 18, 20, 21, 22, 23, 31], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 13], "b": 7, "o": [7, 15, 22, 32], "disk": [7, 10, 13, 18, 24, 26, 32], "possibl": [7, 10, 16, 30, 39], "api": [7, 8, 16, 20], "resolv": 7, "explicitli": [7, 13], "request": [7, 16, 32, 38], "how": [7, 8, 10, 13, 21, 23, 25, 26, 27, 32, 39], "someth": [7, 10, 11, 13, 37], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 13], "horizont": 8, "scale": [8, 38], "backup": 8, "benefit": [8, 39], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 21, 23], "reason": [8, 13, 18, 35, 39], "why": 8, "million": 8, "singl": [8, 13, 32], "capac": 8, "sometim": 8, "traffic": [8, 18, 36, 39], "reachabl": [8, 20], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 13, 20, 21, 23, 26], "expos": [8, 16, 20], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 32], "10903": 8, "10904": 8, "replica": [8, 25, 26, 27, 32, 33, 39], "abov": [8, 21, 23], "last": 8, "db_address": 8, "could": [8, 32, 36, 38, 39], "long": [8, 10, 37], "now": [8, 10], "grafan": 9, "render": [9, 13], "sidecar": 9, "receiv": [9, 10, 39], "distribut": [9, 27, 36, 39], "email": [9, 10], "slack": [9, 10], "displai": [9, 22], "enhanc": [10, 11], "notifi": [10, 11, 32], "wrong": [10, 11, 13, 18, 37, 39], "shown": [10, 18, 21, 23], "overview": [10, 32], "condit": 10, "met": 10, "certain": 10, "defin": [10, 13, 20, 30, 39], "what": 10, "happen": [10, 18], "report": [10, 15, 18, 39], "let": [10, 20], "u": 10, "instancedown": 10, "expr": [10, 13], "60": 10, "sever": [10, 12, 14, 40], "annot": 10, "descript": [10, 32], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 13, 21], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 39], "rout": [10, 27, 39], "repres": 10, "tree": 10, "win": [10, 18], "inhibit": 10, "mute": 10, "via": [10, 18], "sluck": 10, "wors": 10, "correctli": [10, 13, 20, 22], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 22], "reduc": [10, 13, 25], "simul": 10, "actual": [10, 35], "low": [10, 39], "space": 10, "lower": [10, 39], "fire": 10, "show": [10, 13, 15, 39], "propag": 10, "valu": [10, 13, 29, 37, 39], "similar": [10, 13], "free": 10, "big": [10, 39], "bisect": 10, "problem": [10, 31, 32, 38, 39], "explain": [13, 21, 23, 32], "intern": [13, 27, 39], "potenti": [13, 32, 39], "issu": [13, 32, 36, 39], "whenev": 13, "save": 13, "earlier": 13, "overridden": 13, "perman": 13, "eventu": 13, "made": 13, "larg": [13, 32], "maintain": 13, "json": 13, "too": [13, 31, 37], "verbos": 13, "element": [13, 32], "object": 13, "attribut": 13, "graph": [13, 20, 22, 39], "aliascolor": 13, "bar": 13, "error": [13, 32, 33, 35], "fill": [13, 38], "grid": 13, "threshold1": 13, "null": 13, "threshold1color": 13, "rgba": 13, "216": 13, "200": 13, "threshold2": 13, "threshold2color": 13, "234": 13, "112": 13, "gridpo": 13, "w": [13, 18], "x": [13, 18, 19], "y": [13, 19], "id": [13, 18], "isnew": 13, "legend": 13, "avg": 13, "max": 13, "min": 13, "linewidth": 13, "link": [13, 32], "nullpointmod": 13, "percentag": [13, 39], "pointradiu": 13, "flot": 13, "seriesoverrid": 13, "span": 13, "steppedlin": 13, "sum": 13, "node_filesystem_avail": 13, "intervalfactor": 13, "legendformat": 13, "refid": 13, "timefrom": 13, "timeshift": 13, "titl": 13, "size": [13, 28, 39], "tooltip": 13, "msresolut": 13, "share": [13, 31], "sort": [13, 30, 39], "value_typ": 13, "cumul": 13, "transpar": 13, "xaxi": 13, "yax": 13, "percent": 13, "logbas": 13, "101": 13, "short": 13, "imagin": 13, "redund": 13, "resembl": 13, "css": 13, "hierarch": 13, "definit": [13, 20, 39], "inherit": 13, "row": [13, 30, 39], "base_row": 13, "collaps": 13, "height": 13, "250px": 13, "Will": 13, "150px": 13, "output": 13, "consid": 13, "bytes_panel": 13, "byte": 13, "unit": 13, "axi": 13, "adjust": 13, "readabl": 13, "gb": 13, "mb": 13, "grasp": 13, "origin": [13, 34], "12": [13, 18], "wa": [13, 39], "larger": 13, "break": [13, 28, 39], "later": 13, "were": [13, 20, 39], "absolut": 13, "posit": 13, "width": 13, "backward": [13, 18, 20, 22], "ve": 13, "had": 13, "imposs": 13, "hand": 13, "overcom": 13, "transit": [13, 22], "calcul": 13, "taken": [13, 20], "still": 13, "unlik": 13, "partial": 13, "24": 13, "don": 13, "python": 13, "make_dashboard": 13, "revers": [13, 32], "usual": [13, 18, 32, 39], "easier": 13, "wrapper": 13, "re": [13, 27], "just": 13, "refresh": 13, "generate_gener": 13, "ran": 13, "mayb": 13, "interfac": [14, 18], "2021": 15, "2018": [15, 28], "14": [15, 18], "onlin": 16, "prometheus_port": 16, "prometheus_address": 16, "integr": 17, "56090": 18, "old": [18, 21, 22, 23], "howev": 18, "twice": 18, "easiest": 18, "remov": [18, 20], "scylla_manager1": 18, "messag": 18, "wait": [18, 33], "non": [18, 20, 26, 27, 32, 36, 39], "post": 18, "past": [18, 22], "mai": [18, 32, 33, 39], "ownership": 18, "la": 18, "grep": 18, "drwxr": 18, "xr": 18, "4096": 18, "jun": 18, "51": 18, "chown": 18, "appear": 18, "unreach": [18, 33], "immedi": 18, "suspect": 18, "tab": 18, "rang": [18, 39], "align": 18, "On": [18, 32], "41bd3db26240": 18, "entrypoin": 18, "ago": 18, "23": 18, "7001": 18, "tcp": 18, "9042": 18, "9160": 18, "10000": 18, "click": 18, "usag": [18, 27, 39], "fetch": 18, "curl": 18, "scylla_nod": 18, "return": [18, 20, 24, 25, 26, 28, 33, 35, 39], "ef": 18, "gre": 18, "scylla_setup": 18, "9100": 18, "while": [18, 20, 21, 23, 31], "captur": 18, "tshark": 18, "f": 18, "dst": 18, "eth0": 18, "toward": 18, "199": 18, "203": 18, "229": 18, "89": 18, "142": 18, "59212": 18, "ack": 18, "seq": 18, "317": 18, "78193": 18, "158080": 18, "len": 18, "tsval": 18, "79869679": 18, "tsecr": 18, "3347447210": 18, "74": 18, "60440": 18, "syn": 18, "29200": 18, "mss": 18, "1460": 18, "sack_perm": 18, "79988291": 18, "128": 18, "sinc": 20, "parallel": [20, 21, 23], "migrat": [20, 21, 23], "lose": 20, "histor": 20, "process": [20, 31, 38], "safe": 20, "page": [20, 22, 32], "unzip": [20, 21, 22, 23], "3001": [20, 21, 23], "9091": [20, 21, 23], "9094": 20, "fail": [20, 25, 27, 32, 39], "loss": 20, "everyth": 20, "stop": [20, 21, 22, 23], "format": 20, "rule_fil": 20, "9111": 20, "phase": [20, 22], "serv": 20, "remote_read": 20, "v1": 20, "histori": [20, 22], "continu": [20, 21, 23], "back": [20, 25], "recommend": [21, 23], "uninstal": [21, 23], "minor": [21, 23], "9095": [21, 23], "brows": [21, 23], "satisfi": [21, 23], "shut": [21, 23], "caus": [21, 23, 27, 39], "blackout": [21, 23], "normal": [21, 23], "dure": [21, 23], "oper": [21, 23, 32, 39], "complet": [21, 23], "switch": 22, "fulli": 22, "affect": 22, "helper": 22, "node_exporter_instal": 22, "ship": 22, "sub": 22, "color": 22, "simpli": 22, "side": [23, 24, 32, 39], "newer": 23, "primari": [24, 39], "kei": [24, 30, 39], "scan": 24, "These": [24, 39], "kind": [24, 39], "bigger": 24, "care": [24, 25, 26, 39], "replicationfactor": [25, 26], "piec": 25, "determin": [25, 26, 33, 39], "mani": [25, 26, 39], "repli": [25, 26, 28, 33, 35, 39], "unavail": [25, 39], "client": [25, 28, 32, 39], "respond": 25, "accompani": 25, "deep": 25, "understand": 25, "fall": 25, "mechan": 25, "write": 26, "acknowledg": 26, "coordin": [26, 27, 33, 35, 39], "hint": 26, "fact": 26, "yet": 26, "ideal": [27, 39], "latenc": [27, 32, 39], "resourc": [27, 30, 39], "driver": [27, 28, 36, 39], "replic": [27, 33, 35, 39], "prepar": [27, 32, 36], "statement": [27, 29, 32, 36], "balanc": [27, 32, 39], "polici": 27, "cours": 27, "intro": 27, "recap": 27, "ring": [27, 39], "architectur": 27, "chunk": [28, 39], "increas": [28, 39], "overal": [28, 31, 39], "thu": 28, "www": [28, 36], "07": 28, "13": 28, "effici": [28, 39], "optim": [29, 36, 40], "concret": 29, "thumb": 29, "alwai": 29, "favor": 29, "partit": [30, 32], "BY": [30, 39], "ineffici": [30, 39], "consum": 30, "doc": 30, "background": [31, 38], "much": [31, 39], "impact": [31, 32], "face": 31, "compaction_static_shar": 31, "100": [31, 38], "recogn": 32, "bad": 32, "practic": [32, 36], "solv": 32, "left": 32, "categori": [32, 39], "jump": 32, "warn": 32, "cell": 32, "indic": [32, 37, 38, 39], "model": [32, 36, 38, 39], "imbal": 32, "shard": 32, "imbalanc": 32, "hot": 32, "bottleneck": [32, 36], "cach": 32, "hit": 32, "filter": 32, "token": 32, "awar": 32, "order": [32, 39], "due": 32, "unsatisfi": 32, "faulti": 32, "evict": 32, "answer": [33, 35], "aka": 33, "factor": 33, "quorum": [33, 39], "hardwar": [34, 38], "occur": 34, "leav": 35, "risk": 35, "identifi": [35, 39], "evenli": 36, "across": 36, "becom": 36, "explan": 36, "08": 36, "best": 36, "field": 37, "being": 37, "defi": 37, "purpos": 37, "might": 37, "shed": 38, "drop": [38, 39], "compact": 38, "repair": 38, "que": 38, "upper": 39, "gaug": 39, "inspect": 39, "zero": 39, "mislead": 39, "panel": 39, "holder": 39, "prevent": 39, "inject": 39, "rate": 39, "did": 39, "compound": 39, "column": 39, "ks1": 39, "table_demo": 39, "text": 39, "int": 39, "desc": 39, "cat1": 39, "asc": 39, "overhead": 39, "thing": 39, "major": 39, "success": 39, "hurt": 39, "cl": 39, "expens": 39, "term": 39, "cost": 39, "ONE": 39, "local_quorum": 39, "local_on": 39, "reli": 39, "nearest": 39, "advisor": 40}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 32, 40], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 32, 40], "stack": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 32, 40], "us": [2, 5, 6, 8, 13, 24, 25, 26, 30, 40], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 13], "set": [2, 5, 20, 21, 23], "prometheu": [2, 4, 5, 6, 7, 8, 10, 16, 20], "grafana": [2, 5, 6, 7, 13, 18], "provis": 2, "data": [2, 6, 8, 18], "sourc": [2, 8, 18], "file": [2, 6, 18, 21, 23], "dashboard": [2, 6, 13], "load": 2, "start": [2, 6, 7, 18], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 20, 21, 22, 23], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 13, 20, 38], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 34], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 31], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 18], "configur": [5, 6, 8], "enabl": 5, "compat": 6, "matrix": [6, 15], "post": [6, 28, 36], "node": [6, 34], "from": [6, 13], "manag": [6, 7, 11, 18], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 18], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": [6, 20, 21, 22, 23], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 13, 21, 23, 32, 39], "all": [7, 21, 23, 25], "sh": [7, 13], "command": 7, "gener": [7, 13], "option": 7, "relat": [7, 20, 21, 22, 23], "ldap": 7, "support": [7, 15], "retent": 7, "period": 7, "alert": [7, 10, 11, 20], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 24, 25, 26, 27, 28, 29, 30, 36, 39], "updat": 8, "high": 9, "level": [9, 18, 25, 26, 33, 39], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 13], "procedur": [12, 20, 21, 22, 23], "modifi": 13, "limit": 13, "consist": [13, 25, 26, 33, 39], "between": 13, "restart": 13, "upgrad": [13, 18, 19, 20, 21, 22, 23], "templat": 13, "class": 13, "panel": 13, "exampl": 13, "format": 13, "layout": 13, "valid": [13, 20, 21, 22, 23], "refer": 14, "guid": [14, 17, 20, 21, 22, 23], "interfac": 16, "troubleshoot": [17, 18], "problem": 18, "2": [18, 20, 21, 22], "duplic": 18, "inform": 18, "A": 18, "contain": [18, 21, 23], "fail": [18, 33, 35], "To": 18, "And": 18, "permiss": 18, "No": 18, "point": 18, "solut": 18, "chart": 18, "show": 18, "error": [18, 34], "sign": 18, "server": [18, 21, 23], "metric": 18, "notic": 18, "open": 18, "3": [18, 20, 22, 23], "0": 18, "enterpris": 18, "2019": 18, "1": [18, 20, 22], "work": 18, "wireshark": 18, "x": [20, 21, 22, 23], "latest": 20, "new": [20, 21, 22, 23], "rule": 20, "4": 20, "move": [20, 21, 23], "old": 20, "b": 20, "rollback": [20, 21, 22, 23], "link": [20, 21, 22, 23, 26, 27, 28, 30, 36], "y": [21, 23], "": [21, 23], "i": [21, 23, 34], "run": [21, 23], "correct": [21, 23], "correctli": [21, 23], "kill": [21, 23], "node_export": 22, "test": 23, "mode": 23, "some": [24, 25, 26, 27, 28, 29, 30, 33, 35], "allow": [24, 39], "filter": [24, 39], "ani": 26, "univers": [26, 27], "ar": [27, 28, 29, 36], "token": [27, 39], "awar": [27, 39], "select": 28, "non": [28, 29], "page": [28, 39], "blog": [28, 36], "prepar": [29, 37, 39], "revers": [30, 39], "order": 30, "document": 30, "compact": 31, "take": 31, "lot": 31, "cpu": 31, "advisor": 32, "section": 32, "oper": [33, 35], "due": 33, "unsatisfi": 33, "o": 34, "can": 34, "indic": 34, "faulti": 34, "replica": 35, "side": 35, "cql": [36, 39], "balanc": 36, "among": 36, "shard": 36, "statement": [37, 39], "cach": 37, "evict": 37, "overload": 38, "optim": 39, "read": 39, "cross": 39, "dc": 39, "request": 39}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some queries use reverse order": [[30, "some-queries-use-reverse-order"]], "Documentation link": [[30, "documentation-link"]], "Prepared statements cache eviction": [[37, "prepared-statements-cache-eviction"]], "System Overload": [[38, "system-overload"]], "Compaction takes lots of memory and CPU": [[31, "compaction-takes-lots-of-memory-and-cpu"]], "Some operations failed on the replica side": [[35, "some-operations-failed-on-the-replica-side"]], "Scylla Monitoring Stack Advisor": [[32, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[32, "the-advisor-section"]], "Some operation failed due to unsatisfied consistency level": [[33, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "CQL queries are not balanced among shards": [[36, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[36, "blog-post-link"]], "I/O Errors can indicate a node with a faulty disk": [[34, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "The CQL Optimization": [[39, "the-cql-optimization"]], "Prepared Statements": [[39, "prepared-statements"]], "Token Aware": [[39, "token-aware"]], "Paged Queries": [[39, "paged-queries"]], "Reversed CQL Reads": [[39, "reversed-cql-reads"]], "ALLOW FILTERING": [[39, "allow-filtering"]], "Consistency Level": [[39, "consistency-level"]], "Cross DC": [[39, "cross-dc"]], "Cross DC Consistency Level": [[39, "cross-dc-consistency-level"]], "Cross DC read requests": [[39, "cross-dc-read-requests"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "Upgrade Procedure": [[22, "upgrade-procedure"], [21, "upgrade-procedure"], [23, "upgrade-procedure"], [20, "upgrade-procedure"]], "1. Validate node_exporter version": [[22, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[22, "install-the-new-monitoring-stack"], [20, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[22, "validate-the-upgrade"], [20, "validate-the-upgrade"]], "Rollback": [[22, "rollback"], [20, "rollback"]], "Related Links": [[22, "related-links"], [21, "related-links"], [23, "related-links"], [20, "related-links"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[21, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[21, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[21, "setting-the-server-s-files"], [23, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[21, "validate-the-new-version-is-running-the-correct-version"], [23, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[21, "validate-the-version-installed-correctly"], [23, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[21, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[21, "kill-all-containers"], [23, "kill-all-containers"]], "Rollback to version 2.x": [[21, "rollback-to-version-2-x"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[23, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[23, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[23, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[23, "move-to-version-3-y-the-new-version"]], "Rollback to version 3.x": [[23, "rollback-to-version-3-x"]], "Some SELECT queries are non-paged": [[28, "some-select-queries-are-non-paged"]], "Blog-post Links": [[28, "blog-post-links"]], "Some queries use Consistency Level: ALL": [[25, "some-queries-use-consistency-level-all"]], "Some queries are non-prepared": [[29, "some-queries-are-non-prepared"]], "Some queries are not token-aware": [[27, "some-queries-are-not-token-aware"]], "University link": [[27, "university-link"]], "Some queries use Consistency Level: ANY": [[26, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[26, "link-to-scylla-university"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[20, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[20, "upgrade-to-the-latest-1-x-version"]], "Validation": [[20, "validation"], [13, "validation"]], "3. Alerting Rules": [[20, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[20, "moving-to-prometheus-2-x"]], "a. Set the old system": [[20, "a-set-the-old-system"]], "b. Set the new system": [[20, "b-set-the-new-system"]], "Some queries use ALLOW FILTERING": [[24, "some-queries-use-allow-filtering"]], "Using Scylla Monitoring Stack": [[40, "using-scylla-monitoring-stack"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Upgrade Scylla Monitoring Stack": [[19, "upgrade-scylla-monitoring-stack"]], "Scylla Monitoring Stack Procedures": [[12, "scylla-monitoring-stack-procedures"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[17, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Interfaces": [[16, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[16, "prometheus"]], "Scylla Monitoring Stack Reference Guide": [[14, "scylla-monitoring-stack-reference-guide"]], "Adding and Modifying Dashboards": [[13, "adding-and-modifying-dashboards"]], "General Limitations": [[13, "general-limitations"]], "Consistency Between Restarts": [[13, "consistency-between-restarts"]], "Consistency Between Upgrades": [[13, "consistency-between-upgrades"]], "Using Templated Dashboards": [[13, "using-templated-dashboards"]], "The Template Class System": [[13, "the-template-class-system"]], "Panel Example": [[13, "panel-example"]], "Grafana Formats and Layouts": [[13, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[13, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[13, "prerequisite"], [2, "prerequisite"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Support Matrix": [[15, "scylla-monitoring-stack-support-matrix"]], "Troubleshoot Scylla Monitoring Stack": [[18, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[18, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[18, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[18, "a-container-fails-to-start"]], "Files And Directory Permissions": [[18, "files-and-directory-permissions"]], "No Data Points": [[18, "no-data-points"]], "Solution": [[18, "solution"], [18, "id1"], [18, "id2"], [18, "id3"]], "Grafana Chart Shows Error (!) Sign": [[18, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[18, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[18, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[18, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[18, "working-with-wireshark"]], "Scylla Monitoring Stack": [[9, "scylla-monitoring-stack"], [1, "scylla-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "The start-all.sh command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.10/sitemap.xml b/branch-3.10/sitemap.xml new file mode 100644 index 000000000..410351e15 --- /dev/null +++ b/branch-3.10/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.10/troubleshooting/index.html b/branch-3.10/troubleshooting/index.html new file mode 100644 index 000000000..87a146c37 --- /dev/null +++ b/branch-3.10/troubleshooting/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Troubleshooting Guide for Scylla Monitoring Stack

        +
        +
        +

        Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/troubleshooting/monitor_troubleshoot.html b/branch-3.10/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..49feed953 --- /dev/null +++ b/branch-3.10/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,867 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Troubleshoot Scylla Monitoring Stack

        +

        This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

        +
        +

        Problem

        +
        +

        Scylla-Manager 2.2 with Duplicate information

        +

        Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

        +
          +
        • For Manager server: from 56090 to 5090

        • +
        • For Manager Agent: from 56090 to 5090

        • +
        +

        For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

        +

        However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

        +

        The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

        +

        Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

        +
        +
        +

        A Container Fails To Start

        +

        When running ./start-all.sh a container can fail to start. For example you can see the following error message:

        +
        Wait for Prometheus container to start........Error: Prometheus container failed to start
        +
        +
        +

        Should this happen, check the Docker logs for more information.

        +
        docker logs aprom
        +
        +
        +

        Usually the reason for the failure is described in the logs.

        +
        +
        +

        Files And Directory Permissions

        +
        +

        Note

        +

        Avoid running Docker containers as root.

        +
        +

        The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

        +

        If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

        +
        +

        Note

        +

        If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

        +
        +

        For example if your Prometheus data directory is /prom-data and you are using centos user

        +
        ls -la /|grep prom-data
        +
        +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
        +
        +sudo chown -R centos:centos /prom-data
        +
        +ls -la /|grep prom-data
        +
        +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
        +
        +
        +
        +
        +

        No Data Points

        +

        No data points on all data charts.

        +
        +

        Solution

        +

        If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

        +
          +
        1. Login to the Prometheus console:

        2. +
        3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

        4. +
        5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

        6. +
        +
        +
          +
        • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

        • +
        • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

        • +
        • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

        • +
        +
        +

        For example:

        +
        ./start-all.sh -v 3.1
        +
        +
        +

        More on start-all.sh options.

        +
        +
        +
        +

        Grafana Chart Shows Error (!) Sign

        +

        Run this procedure on the Scylla Monitoring Stack server.

        +

        If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

        +
        +

        Solution

        +

        On the Scylla Monitoring Stack server:

        +
          +
        1. Check Prometheus is running using docker ps.

        2. +
        +
          +
        • If it is not running check the prometheus.yml for errors.

        • +
        +

        For example:

        +
        CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
        +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
        +
        +
        +
          +
        • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

        • +
        +
        +
        +
        +

        Grafana Shows Server Level Metrics, but not Scylla Metrics

        +

        Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

        +
        +

        Solution

        +
          +
        • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

        • +
        +

        For example

        +
        curl 172.17.0.2:9180/metrics
        +
        +
        +
        +
        +
        +

        Grafana Shows Scylla Metrics, but not Server Level Metrics

        +

        Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

        +
        +

        Solution

        +

        1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

        +
          +
        1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

        2. +
        +
        +
        +

        Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

        +

        While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

        +

        If the node_exporter service is not starting it may need to be updated manually.

        +

        Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

        +
        +
        +
        +

        Working with Wireshark

        +

        No metrics shown in the Scylla Monitoring Stack.

        +
          +
        1. Install wireshark

        2. +
        +

        2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

        +

        For example:

        +
        tshark -i eth0 -f "dst port 9180"
        +
        +
        +

        Capture from Scylla node towards Scylla Monitoring Stack server.

        +

        In this example, Scylla is running.

        +
        Monitor ip        Scylla node ip
        +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
        +
        +
        +

        In this example, Scylla is not running

        +
        Monitor ip        Scylla node ip
        +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
        +
        +
        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/upgrade/index.html b/branch-3.10/upgrade/index.html new file mode 100644 index 000000000..5ee105da0 --- /dev/null +++ b/branch-3.10/upgrade/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrade Scylla Monitoring Stack

        +
        +
        +
        +
        +
        +
        Upgrade Scylla Open Source
        +
        + +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-3.10/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..d00eb1823 --- /dev/null +++ b/branch-3.10/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

        +

        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

        +

        Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

        +
        +

        Upgrade Procedure

        +
        +

        1. Upgrade to the latest 1.x version

        +

        Before starting the upgrade procedure, make sure you are running the latest 1.x version

        +
        +
        +

        2. Install the new monitoring stack

        +
          +
        1. Download the 2.x version from the release page.

        2. +
        3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

        4. +
        5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

          +
            +
          • scylla_servers.yml

          • +
          • scylla_manager_servers.yml

          • +
          • node_exporter_servers.yml

          • +
          +
        6. +
        7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

        8. +
        +
        ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
        +
        +
        +
        +

        Note

        +

        Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

        +
        +

        While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

        +
        ./kill-all.sh -g 3001 -p 9091 -m 9094
        +
        +
        +
        +

        Validation

        +

        Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

        +
        +
        +
        +

        3. Alerting Rules

        +

        Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

        +
        +
        +

        4. Moving to Prometheus 2.x

        +

        Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

        +

        Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

        +
        +

        a. Set the old system

        +

        The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

        +
          +
        • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

        • +
        • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

        • +
        +
        +

        Note

        +

        After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

        +
        +
        +
        +

        b. Set the new system

        +

        The following step will allow the new monitoring system to read historical metrics from the old system.

        +
          +
        • In the Prometheus prometheus.yml.template file add the following at the end:

        • +
        +
        remote_read:
        +  - url: "http://{ip}:9111/api/v1/read"
        +
        +
        +

        Where {ip} is the ip of the old system.

        +
          +
        • restart the new stack

        • +
        +
        +
        +
        +

        Validate the upgrade

        +

        You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

        +
        +
        +
        +

        Rollback

        +

        In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

        +
        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..d6235f868 --- /dev/null +++ b/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,788 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

        +

        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

        +
        +

        Upgrade Procedure

        +

        We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

        +

        Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

        +
        +

        Install 2.y (The new version)

        +
        wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
        +unzip scylla-monitoring-2.y.zip
        +cd scylla-monitoring-scylla-monitoring-2.y/
        +
        +
        +

        Replace “y” with the new minor release number, for example, 2.1.zip

        +
        +
        +

        Setting the server’s files

        +

        Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

        +
        cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
        +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
        +
        +
        +
        +
        +

        Validate the new version is running the correct version

        +

        Starting from Scylla-Monitoring version 2.2, you can run:

        +
        ./start-all.sh --version
        +
        +
        +

        To validate the Scylla-Monitoring version.

        +
        +
        +

        Validate the version installed correctly

        +

        To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

        +
        ./start-all.sh -p 9091 -g 3001 -m 9095
        +
        +
        +

        Browse to http://{ip}:9091 +And check the Grafana dashboard

        +

        Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

        +
        +

        Caution

        +

        Important: do not use the local dir flag when testing!

        +
        +

        When you are satisfied with the data in the dashboard, you can shut down the containers.

        +
        +

        Caution

        +

        Important: Do not kill the 2.x version that is currently running.

        +
        +

        Use the following command to kill the containers:

        +
        ./kill-all.sh -p 9091 -g 3001 -m 9095
        +
        +
        +

        You can start and stop the new 2.y version while testing.

        +
        +
        +

        Move to version 2.y (the new version)

        +

        Note: migrating will cause a few seconds of blackout in the system.

        +

        We assume that you are using external volume to store the metrics data.

        +
        +

        Kill all containers

        +

        Follow the instruction on how to kill the 2.y version when in testing mode.

        +

        To kill the 2.x version containers, run:

        +
        ./kill-all.sh
        +
        +
        +

        Start version 2.y in normal mode

        +

        From the new root of the scylla-monitoring-scylla-monitoring-2.y run

        +
        ./start-all.sh -d /path/to/data/dir
        +
        +
        +

        Point your browser to http://{ip}:3000 and see that the data is there.

        +
        +
        +
        +

        Rollback to version 2.x

        +

        To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

        +

        To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

        +
        ./kill-all.sh
        +cd /path/to/scylla-grafana-2.x/
        +./start-all.sh -d /path/to/data/dir
        +
        +
        +
        +
        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..ac67791a0 --- /dev/null +++ b/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,752 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

        +

        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

        +

        Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

        +
        +

        Upgrade Procedure

        +
        +

        1. Validate node_exporter version

        +

        Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

        +

        If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

        +
        +
        +

        2. Install the new monitoring stack

        +
          +
        1. Download the 3.x version from the release page.

        2. +
        3. Unzip it into a different directory.

        4. +
        5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

          +
            +
          • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

          • +
          • scylla_manager_servers.yml

          • +
          +
          +
          +

          Note

          +

          The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

          +
          +
          +
        6. +
        7. Stop the old monitoring stack

          +
          +
          ./kill-all.sh
          +
          +
          +
          +
        8. +
        9. Start the new monitoring stack

          +
          +
          ./start-all.sh -d /prometheus-data-path
          +
          +
          +
          +
        10. +
        +
        +
        +

        Validate the upgrade

        +

        You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

        +

        Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

        +
        +
        +
        +

        Rollback

        +

        To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

        +
        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-3.10/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..e3474f8be --- /dev/null +++ b/branch-3.10/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,796 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

        +

        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

        +
        +

        Upgrade Procedure

        +

        We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

        +

        Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

        +
        +

        Install 3.y (The new version)

        +
        wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
        +unzip scylla-monitoring-3.y.zip
        +cd scylla-monitoring-scylla-monitoring-3.y/
        +
        +
        +

        Replace “y” with the new minor release number, for example, 3.0.1.zip

        +
        +
        +

        Setting the server’s files

        +

        Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

        +
        cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
        +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
        +
        +
        +
        +
        +

        Validate the new version is running the correct version

        +

        Starting from Scylla-Monitoring version 2.2, you can run:

        +
        ./start-all.sh --version
        +
        +
        +

        To validate the Scylla-Monitoring version.

        +
        +
        +

        Validate the version installed correctly

        +

        To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

        +
        ./start-all.sh -p 9091 -g 3001 -m 9095
        +
        +
        +

        Browse to http://{ip}:9091 +And check the Grafana dashboard

        +

        Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

        +
        +

        Caution

        +

        Important: do not use the local dir flag when testing!

        +
        +

        When you are satisfied with the data in the dashboard, you can shut down the containers.

        +
        +

        Caution

        +

        Important: Do not kill the 3.x version that is currently running.

        +
        +
        +
        +

        Killing the new 3.y Monitoring stack in testing mode

        +

        Use the following command to kill the containers:

        +
        ./kill-all.sh -p 9091 -g 3001 -m 9095
        +
        +
        +

        You can start and stop the new 3.y version while testing.

        +
        +
        +

        Move to version 3.y (the new version)

        +

        Note: migrating will cause a few seconds of blackout in the system.

        +

        We assume that you are using external volume to store the metrics data.

        +
        +

        Kill all containers

        +

        At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

        +

        Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

        +

        kill the older 3.x version containers by running:

        +
        ./kill-all.sh
        +
        +
        +

        Start version 3.y in normal mode

        +

        From the new root of the scylla-monitoring-scylla-monitoring-3.y run

        +
        ./start-all.sh -d /path/to/data/dir
        +
        +
        +

        Point your browser to http://{ip}:3000 and see that the data is there.

        +
        +
        +
        +

        Rollback to version 3.x

        +

        To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

        +

        To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

        +
        ./kill-all.sh
        +cd /path/to/scylla-grafana-3.x/
        +./start-all.sh -d /path/to/data/dir
        +
        +
        +
        +
        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlAllowFiltering.html b/branch-3.10/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..bc716aa00 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries use ALLOW FILTERING

        +

        Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

        +

        These kinds of queries can create a bigger load on Scylla, and should be used with care.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlCLAll.html b/branch-3.10/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..e363d7136 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries use Consistency Level: ALL

        +

        Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

        +

        Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

        +

        Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlCLAny.html b/branch-3.10/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..456ebab26 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries use Consistency Level: ANY

        +

        Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

        +

        Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlNoTokenAware.html b/branch-3.10/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..6d682fb35 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries are not token-aware

        +

        Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

        +

        Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlNonPaged.html b/branch-3.10/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..a5061b800 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,693 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some SELECT queries are non-paged

        +

        By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

        +
        +

        Blog-post Links

        +

        https://www.scylladb.com/2018/07/13/efficient-query-paging/

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlNonPrepared.html b/branch-3.10/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..fed0a5eff --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries are non-prepared

        +

        Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlReverseOrder.html b/branch-3.10/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..b7db1dbc6 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries use reverse order

        +

        Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

        +

        Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/heavyCompaction.html b/branch-3.10/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..2d33889d8 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Compaction takes lots of memory and CPU

        +

        Scylla runs compaction periodically as a background process. While running compaction is important, there are situations that +the compaction takes too much CPU. +In those cases the compaction would impact the overall system performance.

        +

        When facing this problem, you can statically limit the compaction shares with one of two options:

        +
          +
        1. Change scylla.yml to have compaction_static_shares: 100

        2. +
        +

        or

        +
          +
        1. Start scylla with --compaction-static-shares 100

        2. +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/index.html b/branch-3.10/use-monitoring/advisor/index.html new file mode 100644 index 000000000..1a11b29bb --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/index.html @@ -0,0 +1,713 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Advisor

        +
        +
        +

        The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

        +
        +

        The Advisor section

        +
        +../../_images/advisor_panel.png +
        +

        The Advisor section

        +
        +
        +

        The Advisor section is located on the Overview dashboard and consists of two parts:

        +

        On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

        +

        For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

        +

        On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

        +

        For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

        +

        Each Advisor issue is explained in detail:

        + +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/nodeCLErrors.html b/branch-3.10/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..7683a9d1d --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Some operation failed due to unsatisfied consistency level

        +

        ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

        +

        For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

        +

        When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/nodeIOErrors.html b/branch-3.10/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..3f9041ec8 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        I/O Errors can indicate a node with a faulty disk

        +

        I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/nodeLocalErrors.html b/branch-3.10/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..3a57da36e --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Some operations failed on the replica side

        +

        ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

        +

        An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-3.10/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..74384ba7e --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        CQL queries are not balanced among shards

        +

        For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

        +

        There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

        +
        +

        Blog post link

        +

        https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/preparedCacheEviction.html b/branch-3.10/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..753d8ecd7 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Prepared statements cache eviction

        +

        Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

        +
          +
        • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

        • +
        • The prepared statements cache might be too small for the number of prepared statements.

        • +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/systemOverload.html b/branch-3.10/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..ac201181d --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        System Overload

        +

        There could be multiple indications that a system is overloaded:

        +
          +
        • Timeouts

        • +
        • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

        • +
        • CPU at 100% when no background process (like compaction or repair) runs.

        • +
        • Ques are getting filled.

        • +
        +

        If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/cql_optimization.html b/branch-3.10/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..64b25a79f --- /dev/null +++ b/branch-3.10/use-monitoring/cql_optimization.html @@ -0,0 +1,800 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        The CQL Optimization

        +

        The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

        +
        +../_images/cql_optimization_master.png +
        +

        The CQL Dashboard

        +
        +
        +

        The upper part of the dashboard holds CQL related metrics.

        +

        The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

        +
        +

        Note

        +

        Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

        +
        +

        The following sections describe each of the dashboard’s panel

        +
        +

        Prepared Statements

        +

        Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

        +

        Using prepared statements has the following benefits:

        +
          +
        • The database only needs to parse the query once

        • +
        • The driver can route the query to the right node

        • +
        • Using place-holders and values is safer and prevents CQL-Injection

        • +
        +

        The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

        +

        The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

        +
        +
        +

        Token Aware

        +

        Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

        +

        Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

        +

        The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

        +

        The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

        +
        +
        +

        Paged Queries

        +

        By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

        +

        The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

        +

        The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

        +
        +
        +

        Reversed CQL Reads

        +

        Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

        +

        Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

        +

        For example, look at the following table:

        +
        CREATE TABLE ks1.table_demo (
        +   category text,
        +   type int,
        +   PRIMARY KEY (category, type))
        +WITH CLUSTERING ORDER BY (type DESC);
        +
        +
        +

        The following query uses reverse order:

        +
        select * from ks1.table_demo where category='cat1' order by type ASC;
        +
        +
        +

        The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

        +

        The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

        +
        +
        +

        ALLOW FILTERING

        +

        Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

        +

        These kinds of queries can create a big load on the system, and should be used with care.

        +

        The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

        +

        The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

        +

        The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

        +

        The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

        +

        The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

        +
        +
        +

        Consistency Level

        +

        Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

        +

        The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

        +

        Two consistency levels hold a potential problem and should be used with care ANY and ALL.

        +

        The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

        +

        The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

        +

        The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

        +

        The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

        +
        +
        +

        Cross DC

        +

        Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

        +
        +
        +

        Cross DC Consistency Level

        +

        Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

        +
        +
        +

        Cross DC read requests

        +
        +

        Note

        +

        The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

        +
        +

        In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

        +

        The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/index.html b/branch-3.10/use-monitoring/index.html new file mode 100644 index 000000000..57909dd67 --- /dev/null +++ b/branch-3.10/use-monitoring/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Using Scylla Monitoring Stack

        +
        +
        +

        There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.5/.buildinfo b/branch-3.5/.buildinfo new file mode 100644 index 000000000..436f1210b --- /dev/null +++ b/branch-3.5/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 2c8cc8c88bae495275dec0b9829bb1f3 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-3.5/.doctrees/_common/monitor-description.doctree b/branch-3.5/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..04258a5a3 Binary files /dev/null and b/branch-3.5/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-3.5/.doctrees/alerting.doctree b/branch-3.5/.doctrees/alerting.doctree new file mode 100644 index 000000000..c42010b71 Binary files /dev/null and b/branch-3.5/.doctrees/alerting.doctree differ diff --git a/branch-3.5/.doctrees/cql_optimization.doctree b/branch-3.5/.doctrees/cql_optimization.doctree new file mode 100644 index 000000000..7158a5a5e Binary files /dev/null and b/branch-3.5/.doctrees/cql_optimization.doctree differ diff --git a/branch-3.5/.doctrees/environment.pickle b/branch-3.5/.doctrees/environment.pickle new file mode 100644 index 000000000..a42317d93 Binary files /dev/null and b/branch-3.5/.doctrees/environment.pickle differ diff --git a/branch-3.5/.doctrees/index.doctree b/branch-3.5/.doctrees/index.doctree new file mode 100644 index 000000000..edb1c8cfd Binary files /dev/null and b/branch-3.5/.doctrees/index.doctree differ diff --git a/branch-3.5/.doctrees/matrix.doctree b/branch-3.5/.doctrees/matrix.doctree new file mode 100644 index 000000000..62579ef89 Binary files /dev/null and b/branch-3.5/.doctrees/matrix.doctree differ diff --git a/branch-3.5/.doctrees/min-prod-hw.doctree b/branch-3.5/.doctrees/min-prod-hw.doctree new file mode 100644 index 000000000..e1cab2f8c Binary files /dev/null and b/branch-3.5/.doctrees/min-prod-hw.doctree differ diff --git a/branch-3.5/.doctrees/monitor_troubleshoot.doctree b/branch-3.5/.doctrees/monitor_troubleshoot.doctree new file mode 100644 index 000000000..dfec5bf51 Binary files /dev/null and b/branch-3.5/.doctrees/monitor_troubleshoot.doctree differ diff --git a/branch-3.5/.doctrees/monitor_without_docker.doctree b/branch-3.5/.doctrees/monitor_without_docker.doctree new file mode 100644 index 000000000..96a1229e9 Binary files /dev/null and b/branch-3.5/.doctrees/monitor_without_docker.doctree differ diff --git a/branch-3.5/.doctrees/monitoring_apis.doctree b/branch-3.5/.doctrees/monitoring_apis.doctree new file mode 100644 index 000000000..8aaa21236 Binary files /dev/null and b/branch-3.5/.doctrees/monitoring_apis.doctree differ diff --git a/branch-3.5/.doctrees/monitoring_stack.doctree b/branch-3.5/.doctrees/monitoring_stack.doctree new file mode 100644 index 000000000..981068445 Binary files /dev/null and b/branch-3.5/.doctrees/monitoring_stack.doctree differ diff --git a/branch-3.5/.doctrees/start_all.doctree b/branch-3.5/.doctrees/start_all.doctree new file mode 100644 index 000000000..7e7b246cc Binary files /dev/null and b/branch-3.5/.doctrees/start_all.doctree differ diff --git a/branch-3.5/.doctrees/updating_dashboard.doctree b/branch-3.5/.doctrees/updating_dashboard.doctree new file mode 100644 index 000000000..0eec826d3 Binary files /dev/null and b/branch-3.5/.doctrees/updating_dashboard.doctree differ diff --git a/branch-3.5/.nojekyll b/branch-3.5/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-3.5/404.html b/branch-3.5/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-3.5/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
        +

        404

        +

        The ScyllaDB monster ate your page!

        +

        + Home +

        +
        + + + \ No newline at end of file diff --git a/branch-3.5/CNAME b/branch-3.5/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-3.5/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-3.5/_common/monitor-description.html b/branch-3.5/_common/monitor-description.html new file mode 100644 index 000000000..14341c325 --- /dev/null +++ b/branch-3.5/_common/monitor-description.html @@ -0,0 +1,605 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +

        Scylla Monitor is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

        + + +
        + + + + + +
        + + +
        + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.5/_images/1.png b/branch-3.5/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.5/_images/1.png differ diff --git a/branch-3.5/_images/2.png b/branch-3.5/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.5/_images/2.png differ diff --git a/branch-3.5/_images/3.png b/branch-3.5/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.5/_images/3.png differ diff --git a/branch-3.5/_images/alertmanager.png b/branch-3.5/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.5/_images/alertmanager.png differ diff --git a/branch-3.5/_images/cql_optimization_master.png b/branch-3.5/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.5/_images/cql_optimization_master.png differ diff --git a/branch-3.5/_images/grafana.png b/branch-3.5/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.5/_images/grafana.png differ diff --git a/branch-3.5/_images/monitor.png b/branch-3.5/_images/monitor.png new file mode 100644 index 000000000..c91eecaab Binary files /dev/null and b/branch-3.5/_images/monitor.png differ diff --git a/branch-3.5/_images/monitoring_stack.png b/branch-3.5/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.5/_images/monitoring_stack.png differ diff --git a/branch-3.5/_sources/_common/monitor-description.rst.txt b/branch-3.5/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..4893f70e3 --- /dev/null +++ b/branch-3.5/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitor is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.5/_sources/alerting.rst.txt b/branch-3.5/_sources/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.5/_sources/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.5/_sources/cql_optimization.rst.txt b/branch-3.5/_sources/cql_optimization.rst.txt new file mode 100644 index 000000000..8158d56aa --- /dev/null +++ b/branch-3.5/_sources/cql_optimization.rst.txt @@ -0,0 +1,154 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: /getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + + diff --git a/branch-3.5/_sources/index.rst.txt b/branch-3.5/_sources/index.rst.txt new file mode 100644 index 000000000..c65b962cb --- /dev/null +++ b/branch-3.5/_sources/index.rst.txt @@ -0,0 +1,48 @@ +Scylla Monitor +================= + +.. toctree:: + :hidden: + :maxdepth: 2 + + Install Scylla Monitor Stack + The start-all.sh script + Scylla Monitor Interfaces + Deploy Scylla Monitor Without Docker + Troubleshoot Monitor + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + Upgrade Guide for Scylla Monitor + CQL Optimization Dashboard + Adding and Modifying Dashboards + Alerting + Scylla Monitor Support Matrix + + +.. include:: /_common/monitor-description.rst + +For older versions of Scylla Monitoring see `here `_. + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitor Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`Install Scylla Monitor Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Scylla Monitor Interfaces ` +* :doc:`Deploy Scylla Monitor Without Docker ` +* :doc:`Troubleshoot Scylla Monitor ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* `Upgrade Guide for Monitoring `_ +* :doc:`CQL Optimization Dashboard ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Alerting ` +* :doc:`Scylla Monitor Support Matrix ` +* `Scylla Monitor lesson `_ on Scylla University + diff --git a/branch-3.5/_sources/matrix.rst.txt b/branch-3.5/_sources/matrix.rst.txt new file mode 100644 index 000000000..1aa648778 --- /dev/null +++ b/branch-3.5/_sources/matrix.rst.txt @@ -0,0 +1,80 @@ + +Scylla Monitor Support Matrix +================================ + +The following table shows which version of Scylla Monitor supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitor Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.5.3 + - 3.3, 4.0, 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.5/_sources/min-prod-hw.rst.txt b/branch-3.5/_sources/min-prod-hw.rst.txt new file mode 100644 index 000000000..db5d9c860 --- /dev/null +++ b/branch-3.5/_sources/min-prod-hw.rst.txt @@ -0,0 +1,24 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need **minimal** disk space of + +.. code:: + + 6 * 16 * 200MB ~ 20GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. diff --git a/branch-3.5/_sources/monitor_troubleshoot.rst.txt b/branch-3.5/_sources/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..9873cbad9 --- /dev/null +++ b/branch-3.5/_sources/monitor_troubleshoot.rst.txt @@ -0,0 +1,225 @@ +Troubleshoot Monitoring +======================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +.. contents:: + :depth: 1 + :local: + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +If you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Monitoring server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the monitoring server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Monitoring and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in Scylla Monitoring. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between Scylla Monitoring and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitor server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.5/_sources/monitor_without_docker.rst.txt b/branch-3.5/_sources/monitor_without_docker.rst.txt new file mode 100644 index 000000000..7db83c906 --- /dev/null +++ b/branch-3.5/_sources/monitor_without_docker.rst.txt @@ -0,0 +1,378 @@ +Deploying Scylla Monitoring Without Docker +========================================== + +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. The current monitoring solution does not churn data. + +Install Scylla Monitor +---------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring release. + +``wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz`` + + +2. Open the tar + +``tar -xvf scylla-monitoring-3.5.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.20.0 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz + tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.20.0.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + + +Install Prometheus +------------------ + +Tested with Prometheus version 2.18.1 + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz + tar -xvf prometheus-2.18.1.linux-amd64.tar.gz + +2. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64 + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml + + +3. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi prometheus-2.18.1.linux-amd64/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +4. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:56090 + +5. Create a data directory for Prometheus to store the metrics data + +For example: + +.. code-block:: shell + + mkdir prometheus-2.18.1.linux-amd64/mydata + + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + + cd prometheus-2.18.1.linux-amd64 + ./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata + +Data should start accumulate on: ./mydata + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + + +Install Grafana +--------------- + +Tested with Grafna 6.7.3 + +1. Install Grafana based on the instructions `here`_ make sure to use version 6.7.0 or higher + +.. _`here` : http://docs.grafana.org/installation/ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +``cd scylla-monitoring-scylla-monitoring-3.5/`` + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-6.7.3/public/app + +4. Provision the Dashboard them + +For example Scylla version 4.0 and Scylla manager version 2.0 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-6.7.3/public/build/ + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-6.7.3/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.0.yaml`` would point to: ``/home/centos/grafana-6.7.3/public/build/ver_4.0`` and the FOLDER will be ``4.0`` + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-6.7.3/data/plugins + provisioning = /home/centos/grafana-6.7.3/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-6.7.3/ + ./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + diff --git a/branch-3.5/_sources/monitoring_apis.rst.txt b/branch-3.5/_sources/monitoring_apis.rst.txt new file mode 100644 index 000000000..b0f199038 --- /dev/null +++ b/branch-3.5/_sources/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Monitoring Interfaces +===================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see `Scylla Monitoring Stack `_ + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.5/_sources/monitoring_stack.rst.txt b/branch-3.5/_sources/monitoring_stack.rst.txt new file mode 100644 index 000000000..d01dce563 --- /dev/null +++ b/branch-3.5/_sources/monitoring_stack.rst.txt @@ -0,0 +1,328 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +.. contents:: + :depth: 2 + :local: + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API`_. + +The Scylla Monitoring stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +.. _`Scylla Prometheus API`: monitoring_apis#prometheus + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Server. This server can be the same server that is running Scylla Manager. Alternatively, you can `Deploy Scylla Monitoring Without Docker `_ . + +.. _`docker`: https://docs.docker.com/install/ + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitor to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring +------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz + tar -xvf scylla-monitoring-3.5.tar.gz + cd scylla-monitoring-scylla-monitoring-3.5 + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout branch-3.5 + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring +--------------------------- + +To monitor the cluster, Scylla Monitor (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: /operating-scylla/manager/1.4/add-a-cluster/#add-a-cluster> + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: /operating-scylla/manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag + +For example: + +.. code-block:: sh + + ./start-all.sh -v 3.1,master -M 2.0 -d prometheus-data + +will load the dashboards for Scylla versions ``3.1`` and ``master`` and the dashboard for Scylla Manager ``2.0`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + + + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. + + + diff --git a/branch-3.5/_sources/start_all.rst.txt b/branch-3.5/_sources/start_all.rst.txt new file mode 100644 index 000000000..f970259a6 --- /dev/null +++ b/branch-3.5/_sources/start_all.rst.txt @@ -0,0 +1,98 @@ +The start-all.sh command +======================== + +Scylla Monitor is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "-storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.5/_sources/updating_dashboard.rst.txt b/branch-3.5/_sources/updating_dashboard.rst.txt new file mode 100644 index 000000000..d79e95432 --- /dev/null +++ b/branch-3.5/_sources/updating_dashboard.rst.txt @@ -0,0 +1,298 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +The following document explains how to update or create Grafana dashboards for the Scylla Monitor. + +It will explain about Scylla Monitor dashboard templates and how to modify them. + + +General Limitations +################### +Scylla Monitor uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades. + +consistency between restarts +**************************** + +By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitor (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana. + +consistency between upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitor does. + + +Using templated Dashboards +########################## +Why does Scylla Monitor use dashboard templates? + +We found the Grafana dashboards Json format too verbose to be maintainable. + +Each element in the dashboard file (Each Json object) contains all of its attributes and values. + +For example a typical graph panel would look like: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of Grafana JSON format, we added dashboard templates. + +The template class system +*************************** + +Scylla Monitor dashboard templates use ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example row in the `type.json` defined + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +In a Template it will be used like + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +The output will be + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and override the ``height`` attribute. + + +Panel example +************* + +Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, we used the `bytes_panel` class that generate a graph with bytes as units (that would mean that your +`Y` axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc') + +You can also see that we override the `span` attribute to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each contains multiple panels. +Each row would have a total span of 12, if the total span of the panels be larger than 12, it would +break the lines into multiple lines. + +Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +Panels height will be taken from their row. The `span` attribute is stil supported like you expect it to work, so does row height. + +you can use the `gridPos` attribute which is a Grafana 5.0 format, but not like Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply them all, so for example to specify that a row is 2 units height you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or help you update the template when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +this will replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2018.1 run: + +``.\generate-dashboards.sh -v 2018.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` you should see that it run without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.5/_static/basic.css b/branch-3.5/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.5/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.5/_static/check-solid.svg b/branch-3.5/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.5/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.5/_static/clipboard.min.js b/branch-3.5/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.5/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.5/_static/copybutton.css b/branch-3.5/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.5/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

        Short

        + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.5/_static/copybutton.js b/branch-3.5/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.5/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.5/_static/copybutton_funcs.js b/branch-3.5/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.5/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.5/_static/css/main.css b/branch-3.5/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-3.5/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.5/_static/doctools.js b/branch-3.5/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.5/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.5/_static/documentation_options.js b/branch-3.5/_static/documentation_options.js new file mode 100644 index 000000000..237299273 --- /dev/null +++ b/branch-3.5/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.3.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.5/_static/file.png b/branch-3.5/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.5/_static/file.png differ diff --git a/branch-3.5/_static/img/banner-background.svg b/branch-3.5/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.5/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.5/_static/img/favicon-228x228.png b/branch-3.5/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.5/_static/img/favicon-228x228.png differ diff --git a/branch-3.5/_static/img/favicon-32x32.png b/branch-3.5/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.5/_static/img/favicon-32x32.png differ diff --git a/branch-3.5/_static/img/favicon.ico b/branch-3.5/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.5/_static/img/favicon.ico differ diff --git a/branch-3.5/_static/img/icons/icon-about-team.svg b/branch-3.5/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.5/_static/img/icons/icon-about-us-m.svg b/branch-3.5/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-about-us.svg b/branch-3.5/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-alternator.svg b/branch-3.5/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-apps.svg b/branch-3.5/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-architecture.svg b/branch-3.5/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.5/_static/img/icons/icon-benchmarks.svg b/branch-3.5/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.5/_static/img/icons/icon-blog.svg b/branch-3.5/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.5/_static/img/icons/icon-careers.svg b/branch-3.5/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.5/_static/img/icons/icon-chevron-left.svg b/branch-3.5/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.5/_static/img/icons/icon-chevron-right.svg b/branch-3.5/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.5/_static/img/icons/icon-circe.svg b/branch-3.5/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-clock.svg b/branch-3.5/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-close.svg b/branch-3.5/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-cloud-docs.svg b/branch-3.5/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-cloud.svg b/branch-3.5/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-comparison.svg b/branch-3.5/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.5/_static/img/icons/icon-contact-us.svg b/branch-3.5/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.5/_static/img/icons/icon-developers-blog.svg b/branch-3.5/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.5/_static/img/icons/icon-docs.svg b/branch-3.5/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.5/_static/img/icons/icon-enterprise-m.svg b/branch-3.5/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-enterprise.svg b/branch-3.5/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-events.svg b/branch-3.5/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.5/_static/img/icons/icon-exclamation.svg b/branch-3.5/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-expand.svg b/branch-3.5/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-forum.svg b/branch-3.5/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-getting-started.svg b/branch-3.5/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-glossary.svg b/branch-3.5/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-home.svg b/branch-3.5/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-infoworld.svg b/branch-3.5/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.5/_static/img/icons/icon-integrations.svg b/branch-3.5/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-knowledge-base.svg b/branch-3.5/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-less.svg b/branch-3.5/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-live-test.svg b/branch-3.5/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.5/_static/img/icons/icon-mail-list.svg b/branch-3.5/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-manager.svg b/branch-3.5/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.5/_static/img/icons/icon-memory-management.svg b/branch-3.5/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.5/_static/img/icons/icon-modeling.svg b/branch-3.5/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-monitoring.svg b/branch-3.5/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.5/_static/img/icons/icon-networking.svg b/branch-3.5/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.5/_static/img/icons/icon-news.svg b/branch-3.5/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.5/_static/img/icons/icon-newsletter.svg b/branch-3.5/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.5/_static/img/icons/icon-nsql-guides.svg b/branch-3.5/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.5/_static/img/icons/icon-open-source.svg b/branch-3.5/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.5/_static/img/icons/icon-operator.svg b/branch-3.5/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-overview.svg b/branch-3.5/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.5/_static/img/icons/icon-partners.svg b/branch-3.5/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.5/_static/img/icons/icon-plus.svg b/branch-3.5/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-pricing.svg b/branch-3.5/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.5/_static/img/icons/icon-release-notes.svg b/branch-3.5/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.5/_static/img/icons/icon-resource-center.svg b/branch-3.5/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.5/_static/img/icons/icon-roadmap.svg b/branch-3.5/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.5/_static/img/icons/icon-search.svg b/branch-3.5/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.5/_static/img/icons/icon-slack.svg b/branch-3.5/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-stack-overflow.svg b/branch-3.5/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.5/_static/img/icons/icon-summit.svg b/branch-3.5/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-support.svg b/branch-3.5/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.5/_static/img/icons/icon-tech-talks.svg b/branch-3.5/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.5/_static/img/icons/icon-testing.svg b/branch-3.5/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.5/_static/img/icons/icon-thumbs-down.svg b/branch-3.5/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-thumbs-up.svg b/branch-3.5/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-tip.svg b/branch-3.5/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.5/_static/img/icons/icon-training.svg b/branch-3.5/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.5/_static/img/icons/icon-triangle-down.svg b/branch-3.5/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.5/_static/img/icons/icon-university.svg b/branch-3.5/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.5/_static/img/icons/icon-users-blog.svg b/branch-3.5/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.5/_static/img/icons/icon-warning.svg b/branch-3.5/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-webinars.svg b/branch-3.5/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.5/_static/img/icons/icon-whitepapers.svg b/branch-3.5/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.5/_static/img/icons/icon-workshop.svg b/branch-3.5/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/logo-docs.svg b/branch-3.5/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.5/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.5/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.5/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.5/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.5/_static/img/mascots/404.jpg b/branch-3.5/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.5/_static/img/mascots/404.jpg differ diff --git a/branch-3.5/_static/img/mascots/scylla-3monsters.png b/branch-3.5/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.5/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-alternator.svg b/branch-3.5/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.5/_static/img/mascots/scylla-cloud.svg b/branch-3.5/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.5/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.5/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-computer-headset.png b/branch-3.5/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-cup-number-one.png b/branch-3.5/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-docs.svg b/branch-3.5/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.5/_static/img/mascots/scylla-drivers.svg b/branch-3.5/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.5/_static/img/mascots/scylla-enterprise.svg b/branch-3.5/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.5/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.5/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-forklift-migration.png b/branch-3.5/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-gear.png b/branch-3.5/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-hardhat.png b/branch-3.5/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-headband.png b/branch-3.5/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-headset.png b/branch-3.5/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-hearts.png b/branch-3.5/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-looking-down.png b/branch-3.5/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-looking-up.png b/branch-3.5/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.5/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.5/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-manager.svg b/branch-3.5/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.5/_static/img/mascots/scylla-monitor.svg b/branch-3.5/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.5/_static/img/mascots/scylla-movement-fast.png b/branch-3.5/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-movement.png b/branch-3.5/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-onpremise.png b/branch-3.5/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-opensource.svg b/branch-3.5/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.5/_static/img/mascots/scylla-operator.svg b/branch-3.5/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.5/_static/img/mascots/scylla-plugin.png b/branch-3.5/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-release-mascot.png b/branch-3.5/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-repair.png b/branch-3.5/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-server.png b/branch-3.5/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-sleeping.png b/branch-3.5/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-tall-measure.png b/branch-3.5/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-university.png b/branch-3.5/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-weights.png b/branch-3.5/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-window-cleaning.png b/branch-3.5/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-with-computer-2.png b/branch-3.5/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-with-computer.png b/branch-3.5/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-with-linux.png b/branch-3.5/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-writting.png b/branch-3.5/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.5/_static/img/menu.svg b/branch-3.5/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.5/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.5/_static/img/scylla-monitor.png b/branch-3.5/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.5/_static/img/scylla-monitor.png differ diff --git a/branch-3.5/_static/js/main.bundle.js b/branch-3.5/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-3.5/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
      • Back
      • ',backButtonPosition:"top",wrapper:"
        ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
          "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
          ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
          ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
          ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
          ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
          "],col:[2,"","
          "],tr:[2,"","
          "],td:[3,"","
          "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Alerting

          +

          Alerts are a Prometheus enhancement to notify that something is wrong in the system.

          +

          You can read more about Prometheus alerting here

          +

          By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

          +

          In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

          +

          The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

          +_images/monitoring_stack.png +
          +

          Prometheus Alerts

          +

          The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

          +

          Each alert consists of:

          +
            +
          • Name

          • +
          • What happened

          • +
          • For how long

          • +
          • What to report

          • +
          +

          For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

          +
          - alert: InstanceDown
          +  expr: up == 0
          +  for: 60s
          +  labels:
          +    severity: "2"
          +  annotations:
          +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
          +    summary: Instance {{ $labels.instance }} down
          +
          +
          +

          The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

          +

          The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

          +

          The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

          +

          annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

          +
          +
          +

          Alertmanager

          +

          The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

          +

          The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

          +
            +
          • Routes: Represent a routing tree, the most specific rule, wins

          • +
          • Inhibition: Mute an alert, based on another alert

          • +
          • Receiver: Send a notification via email, sluck, etc’

          • +
          +

          Check the Alertmanager documentation for details on how to specify a specific receiver.

          +

          In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

          +
          +
          +

          Tips When Adding an Alert

          +

          It’s worse having an alert that does not work, than not having an alert at all

          +

          There are multiple ways you can use to make sure your alert is set correctly:

          +
            +
          • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

          • +
          • Force the alert to be active by reducing the limits or the duration.

          • +
          • When possible simulate the actual scenario and see that the alert works as expected.

          • +
          +

          For example, low available disk space.

          +

          Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

          +

          Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

          +

          Starting with a simple working expression helps you bisect problems.

          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/cql_optimization.html b/branch-3.5/cql_optimization.html new file mode 100644 index 000000000..00bf62ac2 --- /dev/null +++ b/branch-3.5/cql_optimization.html @@ -0,0 +1,747 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          The CQL Optimization

          +

          The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver.

          +
          +_images/cql_optimization_master.png +
          +

          The CQL Dashboard

          +
          +
          +

          The upper part of the dashboard holds CQL related metrics.

          +

          The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

          +
          +

          Note

          +

          Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

          +
          +

          The following sections describe each of the dashboard’s panel

          +
          +

          Prepared Statements

          +

          Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

          +

          Using prepared statements has the following benefits:

          +
            +
          • The database only needs to parse the query once

          • +
          • The driver can route the query to the right node

          • +
          • Using place-holders and values is safer and prevents CQL-Injection

          • +
          +

          The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

          +

          The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

          +
          +
          +

          Token Aware

          +

          Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

          +

          Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

          +

          The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

          +

          The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

          +
          +
          +

          Paged Queries

          +

          By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

          +

          The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

          +

          The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

          +
          +
          +

          Reversed CQL Reads

          +

          Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

          +

          Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

          +

          For example, look at the following table:

          +
          CREATE TABLE ks1.table_demo (
          +   category text,
          +   type int,
          +   PRIMARY KEY (category, type))
          +WITH CLUSTERING ORDER BY (type DESC);
          +
          +
          +

          The following query uses reverse order:

          +
          select * from ks1.table_demo where category='cat1' order by type ASC;
          +
          +
          +

          The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

          +

          The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

          +
          +
          +

          ALLOW FILTERING

          +

          Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

          +

          These kinds of queries can create a big load on the system, and should be used with care.

          +

          The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

          +

          The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

          +

          The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

          +

          The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

          +

          The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

          +
          +
          +

          Consistency Level

          +

          Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

          +

          The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

          +

          Two consistency levels hold a potential problem and should be used with care ANY and ALL.

          +

          The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

          +

          The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

          +

          The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

          +

          The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

          +
          +
          +

          Cross DC

          +

          Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

          +
          +
          +

          Cross DC Consistency Level

          +

          Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

          +
          +
          +

          Cross DC read requests

          +
          +

          Note

          +

          The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

          +
          +

          In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

          +

          The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/genindex.html b/branch-3.5/genindex.html new file mode 100644 index 000000000..606c4023e --- /dev/null +++ b/branch-3.5/genindex.html @@ -0,0 +1,601 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + + + + + +
          + + + + + +
          + + +
          + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/index.html b/branch-3.5/index.html new file mode 100644 index 000000000..8d1482365 --- /dev/null +++ b/branch-3.5/index.html @@ -0,0 +1,634 @@ + + + + + + + + + + + + + Scylla Monitor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Scylla Monitor

          +
          +
          +

          Scylla Monitor is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

          +

          For older versions of Scylla Monitoring see here.

          +_images/monitor.png +

          The Scylla Monitor Stack consists of three components, wrapped in Docker containers:

          +
            +
          • prometheus - collects and stores metrics

          • +
          • alertmanager - handles alerts

          • +
          • grafana - dashboard server

          • +
          +

          Choose a topic to get started:

          + +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/matrix.html b/branch-3.5/matrix.html new file mode 100644 index 000000000..6752659c5 --- /dev/null +++ b/branch-3.5/matrix.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + Scylla Monitor Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Scylla Monitor Support Matrix

          +

          The following table shows which version of Scylla Monitor supports dashboards for which versions of Scylla and Scylla Manager.

          + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          Scylla Monitor Version

          Scylla Open Source Version

          Scylla Enterprise Version

          Node_exporter[1] Version

          Scylla Manager Version

          3.5.3

          3.3, 4.0, 4.1, 4.2, 4.3

          2019.1, 2020.1

          0.17

          2.0, 2.1, 2.2

          3.5

          3.3, 4.0, 4.1, 4.2

          2019.1, 2020.1

          0.17

          2.0, 2.1, 2.2

          3.4.3

          3.3, 4.0, 4.1, 4.2

          2019.1, 2020.1

          0.17

          2.0, 2.1

          3.4

          3.3, 4.0, 4.1

          2018.1, 2019.1

          0.17

          2.0, 2.1

          3.3

          3.1, 3.2, 3.3, 4.0

          2018.1, 2019.1

          0.17

          1.4, 2.0, 2.1

          3.2

          3.1, 3.2, 3.3

          2018.1, 2019.1

          0.17

          1.4, 2.0

          3.1

          2.3, 3.0, 3.1, 3.2

          2018.1, 2019.1

          0.17

          1.3, 1.4, 2.0

          3.0

          2.3, 3.0, 3.1, 3.2

          2018.1, 2019.1

          0.17

          1.3, 1.4

          2.4

          2.3, 3.0, 3.1

          2018.1, 2019.1

          0.14, 0.17

          1.3, 1.4

          2.3

          2.3, 3.0

          2018.1, 2019.1

          0.14, 0.17

          1.3

          2.2

          2.3, 3.0

          2018.1, 2019.1

          0.14, 0.17

          1.3

          2.1

          2.3, 3.0

          2018.1

          0.14, 0.17

          1.3

          +

          [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/min-prod-hw.html b/branch-3.5/min-prod-hw.html new file mode 100644 index 000000000..fe0c725f0 --- /dev/null +++ b/branch-3.5/min-prod-hw.html @@ -0,0 +1,628 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Minimal Production System Recommendations

          +
            +
          • CPU - at least 2 physical cores/ 4vCPUs

          • +
          • Memory - 15GB+ DRAM

          • +
          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

          • +
          • Network - 1GbE/10GbE preferred

          • +
          +
          +

          Calculating Prometheus Minimal Disk Space requirement

          +

          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

          +

          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

          +

          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

          +
          6 * 16 * 200MB ~ 20GB
          +
          +
          +

          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

          +
          +
          + + +
          + + + + + +
          + + +
          + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/monitor_troubleshoot.html b/branch-3.5/monitor_troubleshoot.html new file mode 100644 index 000000000..b118864bf --- /dev/null +++ b/branch-3.5/monitor_troubleshoot.html @@ -0,0 +1,826 @@ + + + + + + + + + + + + + Troubleshoot Monitoring | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Troubleshoot Monitoring

          +

          This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

          +
          +

          Problem

          + +
          +

          Scylla-Manager 2.2 with Duplicate information

          +

          Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

          +
            +
          • For Manager server: from 56090 to 5090

          • +
          • For Manager Agent: from 56090 to 5090

          • +
          +

          For backward compatibility, Scylla Monitoring 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

          +

          If you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

          +

          The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

          +

          Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

          +
          +
          +

          A Container Fails To Start

          +

          When running ./start-all.sh a container can fail to start. For example you can see the following error message:

          +
          Wait for Prometheus container to start........Error: Prometheus container failed to start
          +
          +
          +

          Should this happen, check the Docker logs for more information.

          +
          docker logs aprom
          +
          +
          +

          Usually the reason for the failure is described in the logs.

          +
          +
          +

          Files And Directory Permissions

          +
          +

          Note

          +

          Avoid running Docker containers as root.

          +
          +

          The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

          +

          If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

          +
          +

          Note

          +

          If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

          +
          +

          For example if your Prometheus data directory is /prom-data and you are using centos user

          +
          ls -la /|grep prom-data
          +
          +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
          +
          +sudo chown -R centos:centos /prom-data
          +
          +ls -la /|grep prom-data
          +
          +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
          +
          +
          +
          +
          +

          No Data Points

          +

          No data points on all data charts.

          +
          +

          Solution

          +

          If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

          +
            +
          1. Login to the Prometheus console:

          2. +
          3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

          4. +
          5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

          6. +
          +
          +
            +
          • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

          • +
          • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

          • +
          • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

          • +
          +
          +

          For example:

          +
          ./start-all.sh -v 3.1
          +
          +
          +

          More on start-all.sh options.

          +
          +
          +
          +

          Grafana Chart Shows Error (!) Sign

          +

          Run this procedure on the Monitoring server.

          +

          If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

          +
          +

          Solution

          +

          On the monitoring server:

          +
            +
          1. Check Prometheus is running using docker ps.

          2. +
          +
            +
          • If it is not running check the prometheus.yml for errors.

          • +
          +

          For example:

          +
          CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
          +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
          +
          +
          +
            +
          • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

          • +
          +
          +
          +
          +

          Grafana Shows Server Level Metrics, but not Scylla Metrics

          +

          Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

          +
          +

          Solution

          +
            +
          • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Monitoring and Scylla server. In that case, check your IPs and firewalls.

          • +
          +

          For example

          +
          curl 172.17.0.2:9180/metrics
          +
          +
          +
          +
          +
          +

          Grafana Shows Scylla Metrics, but not Server Level Metrics

          +

          Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

          +
          +

          Solution

          +

          1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

          +
            +
          1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring and Scylla server. Please check your IPs and firewalls.

          2. +
          +
          +
          +

          Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

          +

          While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

          +

          If the node_exporter service is not starting it may need to be updated manually.

          +

          Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

          +
          +
          +
          +

          Working with Wireshark

          +

          No metrics shown in Scylla Monitoring.

          +
            +
          1. Install wireshark

          2. +
          +

          2. Capture the traffic between Scylla Monitoring and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

          +

          For example:

          +
          tshark -i eth0 -f "dst port 9180"
          +
          +
          +

          Capture from Scylla node towards Scylla Monitor server.

          +

          In this example, Scylla is running.

          +
          Monitor ip        Scylla node ip
          +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
          +
          +
          +

          In this example, Scylla is not running

          +
          Monitor ip        Scylla node ip
          +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
          +
          +
          +
          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/monitor_without_docker.html b/branch-3.5/monitor_without_docker.html new file mode 100644 index 000000000..34d29616a --- /dev/null +++ b/branch-3.5/monitor_without_docker.html @@ -0,0 +1,954 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Deploying Scylla Monitoring Without Docker

          +

          The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

          +

          Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

          +
          +

          Minimal Production System Recommendations

          +
            +
          • CPU - at least 2 physical cores/ 4vCPUs

          • +
          • Memory - 15GB+ DRAM

          • +
          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

          • +
          • Network - 1GbE/10GbE preferred

          • +
          +
          +

          Calculating Prometheus Minimal Disk Space requirement

          +

          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

          +

          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

          +

          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

          +
          6 * 16 * 200MB ~ 20GB
          +
          +
          +

          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

          +

          The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. The current monitoring solution does not churn data.

          +
          +
          +
          +

          Install Scylla Monitor

          +

          The following procedure uses a CentOS 7 based instance

          +
            +
          1. Download the latest Scylla Monitoring release.

          2. +
          +

          wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz

          +
            +
          1. Open the tar

          2. +
          +

          tar -xvf scylla-monitoring-3.5.tar.gz

          +
          +
          +

          Install Alertmanager

          +

          Tested with alertmanager 0.20.0 version

          +
            +
          1. Install alertmanager

          2. +
          +
          wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz
          +tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz
          +
          +
          +
            +
          1. Copy the following file: rule_config.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to alertmanager.yml in the alertmanager installation directory.

          2. +
          +

          For example:

          +
          cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml
          +
          +
          +
            +
          1. Start the Alertmanager

          2. +
          +

          For example:

          +
          cd alertmanager-0.20.0.linux-amd64
          +./alertmanager
          +
          +
          +
            +
          1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

          2. +
          +

          For example:

          +
          http://192.168.135.166:9093/
          +
          +
          +_images/alertmanager.png +
          +
          +

          Install Prometheus

          +

          Tested with Prometheus version 2.18.1

          +
            +
          1. Install Prometheus

          2. +
          +
          wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz
          +tar -xvf prometheus-2.18.1.linux-amd64.tar.gz
          +
          +
          +
            +
          1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to Prometheus installation directory.

          2. +
          +

          Copy prometheus/prometheus.yml.template to prometheus.yml

          +

          For example:

          +
          cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64
          +cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml
          +
          +
          +
            +
          1. Edit the prometheus.yml file to point to the correct static data sources.

          2. +
          +
          +

          Note

          +

          Make sure to include the honor_labels: false parameter in the prometheus.yml file.

          +
          +
          vi prometheus-2.18.1.linux-amd64/prometheus.yml
          +
          +
          +

          Set the alertmanger address and port by replacing AM_ADDRESS in the file.

          +

          For example if the alertmanager will run on the same host:

          +
          alerting:
          +   alertmanagers:
          +   - static_configs:
          +       - targets:
          +           - 127.0.0.1:9093
          +
          +
          +

          Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

          +

          For example the scrape config for Scylla:

          +
          global:
          +  scrape_interval: 5s # By default, scrape targets every 5 second.
          +  scrape_timeout: 4s # Timeout before trying to scape a target again
          +
          +  # Attach these labels to any time series or alerts when communicating with
          +  # external systems (federation, remote storage, Alertmanager).
          +  external_labels:
          +    monitor: 'scylla-monitor'
          +
          +scrape_configs:
          +- job_name: scylla
          +  honor_labels: false
          +  file_sd_configs:
          +    - files:
          +      - scylla_servers.yml
          +  relabel_configs:
          +    - source_labels: [__address__]
          +      regex:  '([^:]+)'
          +      target_label: __address__
          +      replacement: '${1}:9180'
          +
          +    - source_labels: [__address__]
          +      regex:  '(.*):.+'
          +      target_label: instance
          +      replacement: '${1}'
          +
          +
          +
            +
          1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

          2. +
          +
          +

          Note

          +

          There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

          +
          +

          An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

          +
          +

          Note

          +

          You must have both files even if you are not using Scylla Manager

          +
          +

          Add the labels for the cluster and data-center

          +

          scylla_servers.yml:

          +

          For example:

          +
          cat scylla_servers.yml
          +# List Scylla end points
          +
          +- targets:
          +  - 192.168.66.6
          +  - 192.168.66.244
          +  labels:
          +    cluster: cluster1
          +    dc: dc1
          +- targets:
          +    - 172.17.0.3
          +  labels:
          +    cluster: cluster1
          +    dc: dc2
          +
          +
          +
          +

          Note

          +

          See the previous note about deprecating the node_exporter_servers.yml file.

          +
          +

          scylla_manager_server.yml

          +

          For example:

          +
          - targets:
          +  - 127.0.0.1:56090
          +
          +
          +
            +
          1. Create a data directory for Prometheus to store the metrics data

          2. +
          +

          For example:

          +
          mkdir prometheus-2.18.1.linux-amd64/mydata
          +
          +
          +
            +
          1. Start Prometheus server:

          2. +
          +

          For example:

          +
          cd prometheus-2.18.1.linux-amd64
          +./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata
          +
          +
          +

          Data should start accumulate on: ./mydata

          +
            +
          1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

          2. +
          +

          For example:

          +
          http://192.168.135.166:9090/
          +
          +
          +_images/1.png +

          Prometheus console should be visible

          +
            +
          1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

          2. +
          +

          For example:

          +

          node_memory_MemFree

          +_images/2.png +

          And

          +

          scylla_reactor_utilization

          +_images/3.png +

          At this point Scylla is emitting the metrics and Prometheus is able to store them.

          +
          +
          +

          Install Grafana

          +

          Tested with Grafna 6.7.3

          +
            +
          1. Install Grafana based on the instructions here make sure to use version 6.7.0 or higher

          2. +
          +

          Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

          +
            +
          1. Access Scylla-Grafana-monitoring directory

          2. +
          +

          cd scylla-monitoring-scylla-monitoring-3.5/

          +
            +
          1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

          2. +
          +
          sudo cp -r grafana/plugins /var/lib/grafana/
          +
          +
          +

          If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

          +

          For example:

          +
          cp -r grafana/plugins ../grafana-6.7.3/public/app
          +
          +
          +
            +
          1. Provision the Dashboard them

          2. +
          +

          For example Scylla version 4.0 and Scylla manager version 2.0

          +

          For Grafana installed with yum install

          +
          sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
          +sudo mkdir -p /var/lib/grafana/dashboards
          +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
          +
          +
          +

          For Grafana installed from packages

          +
          cp -p -r grafana/build/* ../grafana-6.7.3/public/build/
          +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml
          +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml
          +
          +
          +

          Edit the load.* files in /home/centos/grafana-6.7.3/conf/provisioning/dashboards/ for the correct path, +for example load.4.0.yaml would point to: /home/centos/grafana-6.7.3/public/build/ver_4.0 and the FOLDER will be 4.0

          +
            +
          1. Set the data source by copy datasource.yml and edit it

          2. +
          +
          sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
          +
          +
          +

          For Grafana installed from packages

          +
          cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/
          +
          +
          +

          You should set the Prometheus and the alertmanager IP and port.

          +

          For example

          +
          sudo cat /etc/grafana/provisioning/datasources/datasource.yml
          +apiVersion: 1
          +datasources:
          + - name: prometheus
          +   type: prometheus
          +   url: http://192.168.135.167:9090
          +   access: proxy
          +   basicAuth: false
          +
          + - name: alertmanager
          +   type: camptocamp-prometheus-alertmanager-datasource
          +   orgId: 1
          +   typeLogoUrl: public/img/icn-datasource.svg
          +   access: proxy
          +   url: http://192.168.135.166:9093
          +   password:
          +   user:
          +   database:
          +   basicAuth:
          +   isDefault:
          +   jsonData:
          +     severity_critical: '4'
          +     severity_high: '3'
          +     severity_warning: '2'
          +     severity_info: '1'
          +
          +
          +
            +
          1. Start the Grafana service

          2. +
          +

          For Grafana installed with yum install

          +

          sudo service grafana-server start

          +

          For Grafana installed from packages:

          +

          cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini

          +

          Edit scylla.ini to reflect the right paths in the paths section of the file.

          +
          plugins = /home/centos/grafana-6.7.3/data/plugins
          +provisioning = /home/centos/grafana-6.7.3/conf/provisioning
          +
          +
          +

          Start the server:

          +
          cd /home/centos/grafana-6.7.3/
          +./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini
          +
          +
          +
            +
          1. Make sure Grafana is running

          2. +
          +

          Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

          +_images/grafana.png +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/monitoring_apis.html b/branch-3.5/monitoring_apis.html new file mode 100644 index 000000000..6b7123c84 --- /dev/null +++ b/branch-3.5/monitoring_apis.html @@ -0,0 +1,647 @@ + + + + + + + + + + + + + Monitoring Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Monitoring Interfaces

          +

          Scylla exposes two interfaces for online monitoring, as described below

          +
          +

          Prometheus

          +

          By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

          +

          For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack

          +

          You can change the Prometheus listening address and port in scylla.yaml file

          +
          # prometheus port
          +# By default, Scylla opens prometheus API port on port 9180
          +# setting the port to 0 will disable the prometheus API.
          +prometheus_port: 9180
          +#
          +# prometheus address
          +# By default, Scylla binds all interfaces to the prometheus API
          +# It is possible to restrict the listening address to a specific one
          +prometheus_address: 0.0.0.0
          +
          +
          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/monitoring_stack.html b/branch-3.5/monitoring_stack.html new file mode 100644 index 000000000..5de91bf57 --- /dev/null +++ b/branch-3.5/monitoring_stack.html @@ -0,0 +1,934 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Install Scylla Monitoring Stack

          + +

          This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API.

          +

          The Scylla Monitoring stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

          +

          For evaluation, you can run Scylla Monitoring stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

          +
          +

          Minimal Production System Recommendations

          +
            +
          • CPU - at least 2 physical cores/ 4vCPUs

          • +
          • Memory - 15GB+ DRAM

          • +
          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

          • +
          • Network - 1GbE/10GbE preferred

          • +
          +
          +

          Calculating Prometheus Minimal Disk Space requirement

          +

          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

          +

          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

          +

          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

          +
          6 * 16 * 200MB ~ 20GB
          +
          +
          +

          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

          +
          +
          +
          +

          Prerequisites

          + +
          +
          +

          Docker Post Installation

          +

          Docker post installation guide can be found here

          +
          +

          Note

          +

          Avoid running the container as root.

          +
          +

          To avoid running docker as root, you should add the user you are going to use for Scylla Monitor to the Docker group.

          +
            +
          1. Create the Docker group.

          2. +
          +
          sudo groupadd docker
          +
          +
          +
            +
          1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

          2. +
          +
          sudo usermod -aG docker $USER
          +
          +
          +
            +
          1. Start Docker by calling:

          2. +
          +
          sudo systemctl enable docker
          +
          +
          +
          +
          +

          Install Scylla Monitoring

          +

          Procedure

          +
            +
          1. Download and extract the latest Scylla Monitoring Stack binary;.

          2. +
          +
          wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz
          +tar -xvf scylla-monitoring-3.5.tar.gz
          +cd scylla-monitoring-scylla-monitoring-3.5
          +
          +
          +

          As an alternative, you can clone and use the Git repository directly.

          +
          git clone https://github.com/scylladb/scylla-monitoring.git
          +cd scylla-monitoring
          +git checkout branch-3.5
          +
          +
          +
            +
          1. Start Docker service if needed

          2. +
          +
          sudo systemctl restart docker
          +
          +
          +
          +
          +

          Configure Scylla Monitoring

          +

          To monitor the cluster, Scylla Monitor (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

          +

          This configuration can be done from files, or using the Consul api.

          +

          Scylla Manager 2.0 and higher supports the Consul API.

          +
          +

          Configure Scylla nodes from files

          +
            +
          1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

          2. +
          +
          +

          Note

          +

          It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

          +
          +

          For example:

          +
          - targets:
          +      - 172.17.0.2
          +      - 172.17.0.3
          +  labels:
          +      cluster: cluster1
          +      dc: dc1
          +
          +
          +
          +

          Note

          +

          If you want to add your managed cluster to Scylla Monitoring, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

          +
          +

          Using IPV6

          +

          To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

          +

          For example:

          +
          - targets:
          +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
          +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
          +  labels:
          +      cluster: cluster1
          +      dc: dc1
          +
          +
          +
          +

          Note

          +

          For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

          +
          +

          For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

          +
          +

          Note

          +

          By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

          +
          +

          If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

          +

          For example:

          +
          ./start-all.sh -s my_scylla_server.yml -d prometheus_data
          +
          +
          +

          Mark the different Data Centers with Labels.

          +

          As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

          +

          You can use the genconfig.py script to generate the server file. For example:

          +
          ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
          +
          +
          +

          This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

          +

          OR

          +

          The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

          +
          nodetool status | ./genconfig.py -NS
          +
          +
          +

          2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

          +

          You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

          +

          For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

          +
          # List Scylla Manager end points
          +
          +- targets:
          +  - 172.17.0.7:5090
          +
          +
          +

          Note that you do not need to add labels to the Scylla Manager targets.

          +
          +
          +

          Configure Scylla nodes using Scylla-Manager Consul API

          +

          Scylla Manager 2.0 has a Consul like API.

          +

          When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

          +

          For example:

          +
          ./start-all.sh -L 10.10.0.1
          +
          +
          +
          +

          Note

          +

          If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

          +
          +
          +
          +

          Connecting Scylla-Monitoring to Scylla

          +

          Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

          +

          You can limit the user to read only, currently it only read table from the system keyspace.

          +

          To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

          +

          Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

          +
          +
          +

          Use an external directory for the Prometheus data directory

          +

          The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

          +
          +

          Note

          +

          Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

          +
          +

          If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

          +

          In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

          +
          +
          +

          Add Additional Prometheus Targets

          +

          There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

          +

          The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

          +

          You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

          +
          - job_name: 'myservice'
          +  # Override the global default and scrape targets from this job every 5 seconds.
          +  scrape_interval: 5s
          +  static_configs:
          +    - targets:
          +      - 17.0.0.1:7000
          +
          +
          +
          +
          +
          +

          Start and Stop Scylla Monitoring Stack

          +
          +

          Start

          +
          ./start-all.sh -d prometheus_data
          +
          +
          +
          +
          +

          Stop

          +
          ./kill-all.sh
          +
          +
          +
          +
          +

          Start a Specific Scylla Monitoring Stack Version

          +

          By default, start-all.sh will start with dashboards for the latest Scylla version and the latest Scylla Manager version.

          +

          You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag

          +

          For example:

          +
          ./start-all.sh -v 3.1,master -M 2.0 -d prometheus-data
          +
          +
          +

          will load the dashboards for Scylla versions 3.1 and master and the dashboard for Scylla Manager 2.0

          +
          +
          +

          Accessing the localhost

          +

          The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

          +
          ./start-all.sh -l -d prometheus-data
          +
          +
          +
          +
          +
          +

          View Grafana Dashboards

          +

          Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/objects.inv b/branch-3.5/objects.inv new file mode 100644 index 000000000..e56c12907 Binary files /dev/null and b/branch-3.5/objects.inv differ diff --git a/branch-3.5/robots.txt b/branch-3.5/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.5/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.5/search.html b/branch-3.5/search.html new file mode 100644 index 000000000..920b46cb5 --- /dev/null +++ b/branch-3.5/search.html @@ -0,0 +1,604 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + + + + + +
          + + + + + +
          + + +
          + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/searchindex.js b/branch-3.5/searchindex.js new file mode 100644 index 000000000..71c88c4da --- /dev/null +++ b/branch-3.5/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "alerting", "cql_optimization", "index", "matrix", "min-prod-hw", "monitor_troubleshoot", "monitor_without_docker", "monitoring_apis", "monitoring_stack", "start_all", "updating_dashboard"], "filenames": ["_common/monitor-description.rst", "alerting.rst", "cql_optimization.rst", "index.rst", "matrix.rst", "min-prod-hw.rst", "monitor_troubleshoot.rst", "monitor_without_docker.rst", "monitoring_apis.rst", "monitoring_stack.rst", "start_all.rst", "updating_dashboard.rst"], "titles": ["<no title>", "Alerting", "The CQL Optimization", "Scylla Monitor", "Scylla Monitor Support Matrix", "Minimal Production System Recommendations", "Troubleshoot Monitoring", "Deploying Scylla Monitoring Without Docker", "Monitoring Interfaces", "Install Scylla Monitoring Stack", "The start-all.sh command", "Adding and Modifying Dashboards"], "terms": {"3": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11], "4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "2": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11], "0": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11], "scylla": [0, 1, 2, 5, 8, 10, 11], "monitor": [0, 1, 2, 5, 10, 11], "stack": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "full": [0, 1, 3], "alert": [0, 3, 7], "The": [0, 1, 3, 4, 5, 6, 7, 9], "contain": [0, 2, 3, 9, 10, 11], "open": [0, 3, 4, 7, 8], "sourc": [0, 1, 3, 4, 7, 9], "tool": [0, 2, 3, 6], "includ": [0, 3, 7], "prometheu": [0, 2, 3, 4, 6, 11], "grafana": [0, 1, 3], "well": [0, 3, 9], "custom": [0, 3], "dashboard": [0, 1, 2, 3, 4, 6, 7, 10], "ar": [1, 2, 6, 7, 9, 10, 11], "enhanc": 1, "notifi": 1, "someth": [1, 10, 11], "wrong": [1, 2, 6, 11], "system": [1, 2, 10], "you": [1, 2, 5, 6, 7, 8, 9, 10, 11], "can": [1, 2, 6, 7, 8, 9, 10, 11], "read": [1, 6, 9], "more": [1, 2, 6, 8, 11], "about": [1, 7, 11], "here": [1, 3, 7, 9, 10, 11], "By": [1, 2, 7, 8, 9, 10, 11], "default": [1, 2, 5, 6, 7, 8, 9, 10, 11], "shown": [1, 6], "overview": 1, "also": [1, 9, 10, 11], "configur": [1, 6, 7, 8, 10, 11], "sent": 1, "other": 1, "extern": [1, 2, 6, 7, 10, 11], "like": [1, 2, 5, 6, 7, 9, 11], "email": 1, "slack": 1, "In": [1, 2, 6, 9, 11], "gener": [1, 2, 9], "specif": [1, 2, 6, 8, 10], "condit": 1, "met": 1, "within": [1, 9], "certain": 1, "period": [1, 5, 7, 9], "time": [1, 2, 5, 7, 9, 10], "thei": [1, 10], "send": [1, 2], "them": [1, 7, 10, 11], "act": 1, "data": [1, 2, 7, 10, 11], "so": [1, 2, 6, 9, 10, 11], "activ": [1, 9], "defin": [1, 2, 11], "rule": [1, 7, 10], "yml": [1, 2, 6, 7, 9, 10], "file": [1, 7, 8, 10, 11], "locat": [1, 10], "directori": [1, 7, 10, 11], "each": [1, 2, 4, 5, 6, 7, 9, 10, 11], "consist": [1, 3], "name": [1, 2, 6, 7, 9], "what": 1, "happen": [1, 6], "For": [1, 2, 3, 5, 6, 7, 8, 9, 10, 11], "how": [1, 2, 10, 11], "long": 1, "report": [1, 2, 4, 6], "exampl": [1, 2, 5, 6, 7, 9, 10], "let": 1, "u": 1, "look": [1, 2, 9, 11], "instancedown": 1, "come": [1, 10], "part": [1, 2, 9], "expr": [1, 11], "up": [1, 2, 6, 7], "60": 1, "label": [1, 7, 9], "sever": 1, "annot": 1, "descript": 1, "instanc": [1, 7, 9, 11], "ha": [1, 2, 5, 6, 7, 9, 10, 11], "been": 1, "down": [1, 6], "than": [1, 2, 11], "30": [1, 10], "second": [1, 6, 7, 9], "summari": 1, "legal": 1, "express": 1, "thi": [1, 2, 5, 6, 7, 9, 10, 11], "case": [1, 2, 5, 6, 7, 9, 10], "metric": [1, 2, 3, 4, 5, 7, 9, 10, 11], "equal": 1, "set": [1, 7, 8, 9, 10, 11], "minim": 1, "durat": 1, "befor": [1, 2, 7, 9], "prior": 1, "pend": 1, "mode": [1, 11], "hold": [1, 2, 5, 7, 9], "addit": [1, 2, 10], "special": 1, "add": [1, 2, 7, 8, 10, 11], "us": [1, 2, 5, 6, 7, 10], "notif": 1, "forward": 1, "get": [1, 2, 3, 9, 11], "from": [1, 2, 6, 7, 10], "server": [1, 2, 3, 7, 8, 9, 10, 11], "respons": 1, "duplic": [1, 2], "group": [1, 9], "rout": [1, 2], "found": [1, 7, 9, 10, 11], "rule_config": [1, 7, 10], "three": [1, 3, 9], "repres": 1, "tree": 1, "most": [1, 2, 7, 11], "win": [1, 6], "inhibit": 1, "mute": 1, "base": [1, 2, 7, 9, 10, 11], "anoth": [1, 10], "receiv": [1, 2], "via": [1, 6], "sluck": 1, "etc": [1, 7, 9, 10, 11], "check": [1, 2, 6], "document": [1, 6, 9, 11], "detail": 1, "specifi": [1, 6, 9, 10, 11], "tabl": [1, 2, 4, 9], "It": [1, 8, 9, 10, 11], "": [1, 2, 9, 10, 11], "wors": 1, "have": [1, 5, 6, 7, 9, 10, 11], "doe": [1, 2, 5, 6, 7, 9, 10, 11], "work": [1, 9, 10, 11], "all": [1, 2, 3, 6, 8, 9, 11], "There": [1, 7, 9, 11], "multipl": [1, 2, 9, 10, 11], "wai": [1, 2, 6, 10], "make": [1, 2, 6, 7, 9, 10, 11], "sure": [1, 2, 6, 7, 9, 11], "your": [1, 2, 6, 7, 8, 9, 10, 11], "correctli": [1, 11], "start": [1, 3, 7, 11], "path": [1, 7, 9, 10], "mail": 1, "simpl": 1, "negat": 1, "logic": 1, "forc": 1, "reduc": [1, 11], "limit": [1, 2, 9], "possibl": [1, 2, 8, 10], "simul": 1, "actual": 1, "scenario": 1, "see": [1, 2, 3, 5, 6, 7, 8, 9, 11], "expect": [1, 11], "low": [1, 2], "avail": [1, 2, 7, 9, 11], "disk": [1, 6, 10, 11], "space": 1, "assum": [1, 5, 7, 9, 10], "want": [1, 9], "lower": [1, 2], "10": [1, 9, 11], "fire": 1, "That": [1, 10, 11], "would": [1, 2, 7, 9, 11], "show": [1, 2, 4, 11], "propag": 1, "ani": [1, 2, 6, 7, 9, 11], "valu": [1, 2, 11], "similar": [1, 11], "current": [1, 6, 7, 9, 10, 11], "situat": [1, 2, 9, 10], "now": 1, "free": 1, "below": [1, 8, 9], "creat": [1, 2, 6, 7, 9, 10, 11], "some": 1, "big": [1, 2], "help": [1, 2, 7, 10, 11], "bisect": 1, "problem": [1, 2], "identifi": 2, "potenti": 2, "issu": [2, 11], "model": 2, "driver": 2, "upper": 2, "relat": 2, "gaug": 2, "graph": [2, 11], "when": [2, 5, 6, 7, 9, 10, 11], "inspect": 2, "we": [2, 5, 7, 9, 11], "zero": 2, "besid": [2, 10], "intern": [2, 11], "which": [2, 4, 11], "mislead": 2, "test": [2, 6, 7], "traffic": [2, 6], "follow": [2, 4, 5, 6, 7, 9, 10, 11], "section": [2, 5, 6, 7, 9], "describ": [2, 6, 8, 9], "panel": 2, "first": 2, "templat": [2, 6, 7, 9], "place": [2, 9, 10, 11], "holder": 2, "differ": [2, 7, 9, 10, 11], "benefit": 2, "databas": [2, 7, 10], "onli": [2, 9, 10], "need": [2, 5, 6, 7, 9, 10, 11], "pars": [2, 11], "onc": 2, "right": [2, 7, 9, 11], "node": [2, 4, 5, 6, 7, 10], "safer": 2, "prevent": 2, "inject": 2, "non": [2, 6], "percentag": [2, 11], "rate": 2, "both": [2, 6, 7, 9], "distribut": 2, "where": [2, 6, 7, 9, 11], "rang": [2, 6], "ring": 2, "ideal": 2, "reach": [2, 9], "one": [2, 8, 10], "replica": 2, "fail": 2, "do": [2, 6, 9, 10, 11], "mean": [2, 10, 11], "coordin": 2, "result": [2, 9, 10], "higher": [2, 7, 9], "latenc": 2, "increas": 2, "resourc": 2, "usag": [2, 6], "typic": [2, 7, 11], "know": [2, 6, 9], "replic": 2, "load": [2, 6, 7, 9], "balanc": 2, "caus": 2, "did": 2, "break": [2, 11], "chunk": 2, "repli": 2, "size": [2, 11], "requir": 2, "return": [2, 6], "overal": 2, "client": 2, "should": [2, 6, 7, 9, 11], "avoid": [2, 6, 9, 11], "support": [2, 3, 9, 11], "compound": 2, "primari": 2, "kei": 2, "cluster": [2, 5, 7, 9], "column": 2, "kind": 2, "an": [2, 5, 6, 7, 10, 11], "effici": 2, "sort": [2, 11], "order": 2, "BY": 2, "wa": [2, 11], "ineffici": 2, "ks1": 2, "table_demo": 2, "categori": 2, "text": 2, "type": [2, 7, 11], "int": 2, "WITH": 2, "desc": 2, "select": 2, "cat1": 2, "asc": 2, "side": 2, "user": [2, 7, 9, 10], "overhead": 2, "These": 2, "care": 2, "two": [2, 8, 9, 10], "thing": 2, "mani": 2, "exist": [2, 9, 11], "much": 2, "drop": 2, "row": [2, 11], "were": 2, "indic": 2, "match": [2, 9], "reason": [2, 6, 11], "A": [2, 10, 11], "determin": 2, "common": [2, 10], "quorum": 2, "major": 2, "success": 2, "mai": [2, 6], "hurt": 2, "persist": [2, 5, 7, 9, 10], "lost": [2, 9, 10, 11], "cl": 2, "unavail": 2, "oper": 2, "usual": [2, 6, 11], "expens": 2, "term": 2, "cost": 2, "could": 2, "ONE": 2, "perform": [2, 5, 7, 9], "end": [2, 7, 9], "local": [2, 6, 7, 9, 10, 11], "local_quorum": 2, "local_on": 2, "instead": [2, 7, 9], "reli": 2, "definit": [2, 11], "per": [2, 5, 7, 9], "center": [2, 7, 9], "scylla_serv": [2, 6, 7, 9], "If": [2, 6, 7, 9, 10, 11], "nearest": 2, "between": [2, 6], "older": 3, "version": [3, 4, 6, 7, 10, 11], "compon": 3, "wrap": 3, "docker": [3, 6, 10], "collect": [3, 10], "store": [3, 7, 11], "alertmanag": [3, 10], "handl": [3, 9, 10], "choos": [3, 6], "topic": 3, "instal": [3, 6], "sh": [3, 6, 9], "script": [3, 9, 10, 11], "interfac": [3, 6], "deploi": [3, 9], "without": [3, 9, 10, 11], "troubleshoot": 3, "guid": [3, 6, 9], "manag": [3, 4, 7], "integr": 3, "upgrad": 3, "cql": [3, 9], "optim": 3, "ad": [3, 5, 7, 9, 10], "modifi": 3, "matrix": 3, "lesson": 3, "univers": 3, "enterpris": [4, 11], "node_export": [4, 6, 7, 9, 10], "1": [4, 7, 9, 10, 11], "5": [4, 5, 6, 7, 9, 11], "2019": 4, "2020": 4, "17": [4, 6, 7, 9], "2018": [4, 11], "14": [4, 6], "agent": [4, 6, 9, 10], "run": [4, 6, 7, 9, 10, 11], "o": [4, 10], "cpu": [5, 7, 9], "least": [5, 7, 9], "physic": [5, 7, 9], "core": [5, 7, 9], "4vcpu": [5, 7, 9], "memori": [5, 7, 9], "15gb": [5, 7, 9], "dram": [5, 7, 9], "storag": [5, 7, 9, 10, 11], "proport": [5, 7, 9], "number": [5, 7, 9], "retent": [5, 7, 9], "network": [5, 6, 7, 9, 10], "1gbe": [5, 7, 9], "10gbe": [5, 7, 9], "prefer": [5, 6, 7, 9], "block": [5, 7, 9], "volum": [5, 7, 9], "ec2": [5, 7, 9], "eb": [5, 7, 9], "15": [5, 7, 9], "dai": [5, 7, 9, 10], "around": [5, 6, 7, 9], "200mb": [5, 7, 9], "scrape": [5, 7, 9], "interv": [5, 7, 9], "6": [5, 7, 9, 11], "16": [5, 6, 7, 9], "20gb": [5, 7, 9], "To": [5, 7, 8, 9, 11], "account": [5, 7, 9], "unexpect": [5, 7, 9], "event": [5, 7, 9], "replac": [5, 7, 9, 11], "alloc": [5, 7, 9], "x4": [5, 7, 9], "100gb": [5, 7, 9], "fast": [5, 7, 9], "enough": [5, 7, 9], "provid": [5, 7, 9], "out": [5, 7, 9], "box": [5, 7, 9], "step": [6, 7, 11], "done": [6, 9, 10, 11], "chang": [6, 8, 10, 11], "port": [6, 7, 8, 9, 10], "56090": [6, 7], "5090": [6, 9], "backward": [6, 11], "compat": [6, 11], "old": 6, "new": [6, 9], "updat": [6, 7, 11], "scylla_manager_serv": [6, 7, 9], "twice": 6, "easiest": 6, "edit": [6, 7, 9, 10, 11], "remov": 6, "scylla_manager1": 6, "job": [6, 9], "note": [6, 7, 9, 10], "take": [6, 10, 11], "effect": [6, 11], "kill": [6, 9], "messag": 6, "wait": 6, "log": [6, 9], "aprom": 6, "failur": 6, "root": [6, 9], "post": 6, "becaus": [6, 10], "own": [6, 9, 10], "proper": 6, "past": 6, "ownership": 6, "prom": 6, "cento": [6, 7], "l": [6, 9, 10], "la": 6, "grep": 6, "drwxr": 6, "xr": 6, "x": [6, 11], "4096": 6, "jun": 6, "25": 6, "51": 6, "sudo": [6, 7, 9], "chown": 6, "r": [6, 7, 10, 11], "appear": 6, "unreach": 6, "immedi": 6, "suspect": 6, "connect": [6, 8, 11], "login": [6, 9], "consol": [6, 7], "browser": [6, 7, 9, 11], "http": [6, 7, 9], "ip": [6, 7, 8, 9, 10], "9090": [6, 7], "address": [6, 7, 8, 9, 10], "go": [6, 9], "target": [6, 7, 8, 10, 11], "tab": 6, "127": [6, 7, 10], "insid": [6, 7, 9, 10, 11], "host": [6, 7, 9, 10], "try": [6, 7], "flag": [6, 9, 10, 11], "enabl": [6, 9], "confirm": 6, "pull": [6, 9], "align": 6, "v": [6, 9, 10, 11], "option": [6, 9], "procedur": [6, 7, 9], "On": 6, "p": [6, 7, 10], "id": [6, 11], "imag": 6, "command": [6, 9], "statu": [6, 9], "41bd3db26240": 6, "entrypoin": 6, "ago": 6, "23": 6, "7000": [6, 9], "7001": 6, "tcp": 6, "9042": 6, "9160": 6, "9180": [6, 7, 8, 9], "10000": 6, "gui": [6, 10, 11], "click": 6, "fetch": 6, "curl": 6, "scylla_nod": 6, "binari": [6, 9], "firewal": [6, 9], "172": [6, 7, 9], "machin": [6, 9, 10], "ef": 6, "gre": 6, "scylla_setup": 6, "9100": 6, "pleas": [6, 7], "while": 6, "servic": [6, 7, 9], "manual": 6, "captur": 6, "tshark": 6, "f": 6, "dst": 6, "eth0": 6, "toward": 6, "199": 6, "203": 6, "229": 6, "89": 6, "12": [6, 11], "142": 6, "66": [6, 7], "59212": 6, "ack": 6, "seq": 6, "317": 6, "78193": 6, "158080": 6, "len": 6, "tsval": 6, "79869679": 6, "tsecr": 6, "3347447210": 6, "74": 6, "60440": 6, "syn": 6, "29200": 6, "mss": 6, "1460": 6, "sack_perm": 6, "79988291": 6, "w": [6, 11], "128": 6, "instruct": 7, "main": 7, "item": 7, "indefinit": 7, "accru": 7, "solut": 7, "churn": 7, "7": [7, 9, 11], "download": [7, 9], "latest": [7, 9, 10], "releas": 7, "wget": [7, 9], "github": [7, 9], "com": [7, 9], "scylladb": [7, 9], "archiv": [7, 9], "tar": [7, 9], "gz": [7, 9], "xvf": [7, 9], "20": 7, "v0": 7, "linux": 7, "amd64": 7, "copi": 7, "cp": 7, "home": 7, "cd": [7, 9], "verifi": 7, "point": [7, 9, 11], "192": [7, 9], "168": [7, 9], "135": 7, "166": 7, "9093": 7, "18": 7, "v2": 7, "correct": 7, "static": 7, "honor_label": 7, "fals": [7, 11], "paramet": [7, 10], "vi": 7, "alertmang": 7, "am_address": 7, "same": [7, 9], "static_config": [7, 9], "manager_ag": 7, "config": [7, 10], "global": [7, 9], "scrape_interv": [7, 9], "everi": [7, 9, 10], "scrape_timeout": 7, "timeout": 7, "scape": 7, "again": [7, 9], "attach": 7, "seri": 7, "commun": 7, "feder": 7, "remot": 7, "external_label": 7, "scrape_config": 7, "job_nam": [7, 9], "file_sd_config": 7, "relabel_config": 7, "source_label": 7, "__address__": 7, "regex": 7, "target_label": 7, "node_exporter_serv": [7, 9], "those": 7, "under": [7, 9], "must": [7, 9], "even": [7, 9, 10], "cat": 7, "list": [7, 9], "244": 7, "cluster1": [7, 9], "dc": [7, 9], "dc1": [7, 9], "dc2": [7, 9], "previou": 7, "deprec": 7, "mkdir": 7, "mydata": 7, "tsdb": [7, 10], "accumul": 7, "visibl": 7, "execut": 7, "queri": 7, "through": 7, "node_memory_memfre": 7, "And": 7, "scylla_reactor_util": 7, "At": [7, 11], "emit": 7, "abl": 7, "grafna": 7, "depend": 7, "repositori": [7, 9], "yum": 7, "zip": 7, "structur": 7, "rest": 7, "access": [7, 10], "plugin": 7, "var": 7, "lib": 7, "packag": 7, "public": 7, "app": 7, "provis": [7, 9, 11], "yaml": [7, 8, 9], "build": 7, "conf": 7, "manager_2": 7, "ver_4": 7, "folder": 7, "datasourc": [7, 9, 11], "apivers": 7, "url": 7, "167": 7, "proxi": 7, "basicauth": 7, "camptocamp": 7, "orgid": 7, "typelogourl": 7, "img": 7, "icn": 7, "svg": 7, "password": [7, 9, 10], "isdefault": 7, "jsondata": 7, "severity_crit": 7, "severity_high": 7, "severity_warn": 7, "severity_info": 7, "sampl": 7, "ini": 7, "reflect": 7, "bin": 7, "3000": [7, 9], "assumpt": 7, "colloc": 7, "expos": 8, "onlin": 8, "listen": [8, 9, 10], "request": [8, 10], "inform": [8, 9, 10, 11], "api": [8, 10], "disabl": [8, 9], "prometheus_port": 8, "bind": [8, 10], "restrict": 8, "prometheus_address": 8, "setup": 9, "dedic": 9, "over": 9, "evalu": 9, "laptop": 9, "altern": 9, "groupadd": 9, "next": [9, 10], "usermod": 9, "ag": 9, "call": [9, 10], "systemctl": 9, "extract": 9, "As": [9, 11], "clone": 9, "git": 9, "directli": 9, "checkout": 9, "branch": 9, "restart": [9, 10], "wish": [9, 10], "import": [9, 10], "datacent": 9, "nodetool": 9, "valid": 9, "ipv6": 9, "squar": 9, "bracket": 9, "2600": 9, "1f18": 9, "26b1": 9, "3a00": 9, "fac8": 9, "118e": 9, "9199": 9, "67b9": 9, "67ba": 9, "web": 9, "overrid": [9, 10, 11], "pass": [9, 10], "n": [9, 10], "my_scylla_serv": 9, "d": [9, 10], "prometheus_data": 9, "mark": 9, "seen": 9, "its": [9, 10, 11], "genconfig": 9, "py": [9, 11], "myconf": 9, "four": 9, "OR": 9, "line": [9, 10, 11], "protect": 9, "author": [9, 10], "assign": 9, "keyspac": 9, "uncom": 9, "securejsondata": 9, "outsid": [9, 10], "permiss": 9, "somewher": 9, "els": [9, 10], "either": 9, "myservic": 9, "m": [9, 10], "master": 9, "authent": [9, 10], "admin": [9, 10], "simplest": 10, "small": 10, "util": [10, 11], "appropri": 10, "h": [10, 11], "print": 10, "exit": 10, "applic": 10, "localhost": 10, "cannot": 10, "map": 10, "explicit": 10, "encapsul": 10, "param": 10, "allow": 10, "g": 10, "dir": 10, "keep": 10, "clear": 10, "comma": 10, "separ": 10, "j": 10, "c": 10, "environ": 10, "variabl": 10, "alter": 10, "q": 10, "anonym": 10, "role": 10, "privileg": 10, "behavior": 10, "editor": 10, "viewer": 10, "suppli": [10, 11], "product": 10, "b": 10, "relev": 10, "consul": 10, "resolv": 10, "ignor": 10, "explicitli": [10, 11], "week": 10, "opportun": 10, "demonstr": 10, "cover": 10, "30d": 10, "arbitrari": 10, "explain": 11, "whenev": 11, "gone": 11, "save": 11, "mention": 11, "earlier": 11, "overridden": 11, "perman": 11, "eventu": 11, "made": 11, "larg": 11, "suggest": 11, "maintain": 11, "why": 11, "json": 11, "too": 11, "verbos": 11, "element": 11, "object": 11, "attribut": 11, "aliascolor": 11, "bar": 11, "true": 11, "error": 11, "fill": 11, "grid": 11, "threshold1": 11, "null": 11, "threshold1color": 11, "rgba": 11, "216": 11, "200": 11, "27": 11, "threshold2": 11, "threshold2color": 11, "234": 11, "112": 11, "22": 11, "gridpo": 11, "y": 11, "isnew": 11, "legend": 11, "avg": 11, "max": 11, "min": 11, "total": 11, "linewidth": 11, "link": 11, "nullpointmod": 11, "pointradiu": 11, "render": 11, "flot": 11, "seriesoverrid": 11, "span": 11, "steppedlin": 11, "sum": 11, "node_filesystem_avail": 11, "intervalfactor": 11, "legendformat": 11, "refid": 11, "timefrom": 11, "timeshift": 11, "titl": 11, "tooltip": 11, "msresolut": 11, "share": 11, "value_typ": 11, "cumul": 11, "transpar": 11, "xaxi": 11, "yax": 11, "percent": 11, "logbas": 11, "101": 11, "short": 11, "imagin": 11, "redund": 11, "resembl": 11, "css": 11, "hierarch": 11, "inherit": 11, "base_row": 11, "collaps": 11, "height": 11, "250px": 11, "150px": 11, "output": 11, "bytes_panel": 11, "byte": 11, "unit": 11, "axi": 11, "adjust": 11, "themselv": 11, "readabl": 11, "e": 11, "gb": 11, "mb": 11, "grasp": 11, "origin": 11, "larger": 11, "later": 11, "longer": 11, "absolut": 11, "posit": 11, "ie": 11, "width": 11, "ve": 11, "had": 11, "imposs": 11, "hand": 11, "overcom": 11, "transit": 11, "calcul": 11, "taken": 11, "stil": 11, "partial": 11, "24": 11, "don": 11, "t": 11, "python": 11, "make_dashboard": 11, "revers": 11, "singl": 11, "easier": 11, "wrapper": 11, "re": 11, "just": 11, "refresh": 11, "after": 11, "generate_gener": 11, "mayb": 11}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"alert": [1, 10], "prometheu": [1, 5, 7, 8, 9, 10], "alertmanag": [1, 7], "tip": 1, "when": 1, "ad": [1, 11], "an": [1, 9], "The": [2, 10, 11], "cql": 2, "optim": 2, "prepar": 2, "statement": 2, "token": 2, "awar": 2, "page": 2, "queri": 2, "revers": 2, "read": 2, "allow": 2, "filter": 2, "consist": [2, 11], "level": [2, 6], "cross": 2, "dc": 2, "request": 2, "scylla": [3, 4, 6, 7, 9], "monitor": [3, 4, 6, 7, 8, 9], "support": [4, 10], "matrix": 4, "minim": [5, 7, 9], "product": [5, 7, 9], "system": [5, 7, 9, 11], "recommend": [5, 7, 9], "calcul": [5, 7, 9], "disk": [5, 7, 9], "space": [5, 7, 9], "requir": [5, 7, 9], "troubleshoot": 6, "problem": 6, "manag": [6, 9, 10], "2": 6, "duplic": 6, "inform": 6, "A": 6, "contain": 6, "fail": 6, "To": 6, "start": [6, 9, 10], "file": [6, 9], "And": 6, "directori": [6, 9], "permiss": 6, "No": 6, "data": [6, 9], "point": 6, "solut": 6, "grafana": [6, 7, 9, 10, 11], "chart": 6, "show": 6, "error": 6, "sign": 6, "server": 6, "metric": 6, "notic": 6, "user": 6, "upgrad": [6, 11], "open": 6, "sourc": 6, "3": 6, "0": 6, "enterpris": 6, "2019": 6, "1": 6, "work": 6, "wireshark": 6, "deploi": 7, "without": 7, "docker": [7, 9], "instal": [7, 9], "interfac": 8, "stack": 9, "prerequisit": [9, 11], "post": 9, "configur": 9, "node": 9, "from": [9, 11], "us": [9, 11], "consul": 9, "api": 9, "connect": 9, "extern": 9, "add": 9, "addit": 9, "target": 9, "stop": 9, "specif": 9, "version": 9, "access": 9, "localhost": 9, "view": 9, "dashboard": [9, 11], "all": 10, "sh": [10, 11], "command": 10, "gener": [10, 11], "option": 10, "relat": 10, "ldap": 10, "retent": 10, "period": 10, "modifi": 11, "limit": 11, "between": 11, "restart": 11, "templat": 11, "class": 11, "panel": 11, "exampl": 11, "format": 11, "layout": 11, "valid": 11}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"The CQL Optimization": [[2, "the-cql-optimization"]], "Prepared Statements": [[2, "prepared-statements"]], "Token Aware": [[2, "token-aware"]], "Paged Queries": [[2, "paged-queries"]], "Reversed CQL Reads": [[2, "reversed-cql-reads"]], "ALLOW FILTERING": [[2, "allow-filtering"]], "Consistency Level": [[2, "consistency-level"]], "Cross DC": [[2, "cross-dc"]], "Cross DC Consistency Level": [[2, "cross-dc-consistency-level"]], "Cross DC read requests": [[2, "cross-dc-read-requests"]], "Alerting": [[1, "alerting"]], "Prometheus Alerts": [[1, "prometheus-alerts"]], "Alertmanager": [[1, "alertmanager"]], "Tips When Adding an Alert": [[1, "tips-when-adding-an-alert"]], "Scylla Monitor Support Matrix": [[4, "scylla-monitor-support-matrix"]], "Scylla Monitor": [[3, "scylla-monitor"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [7, "minimal-production-system-recommendations"], [9, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [7, "calculating-prometheus-minimal-disk-space-requirement"], [9, "calculating-prometheus-minimal-disk-space-requirement"]], "Deploying Scylla Monitoring Without Docker": [[7, "deploying-scylla-monitoring-without-docker"]], "Install Scylla Monitor": [[7, "install-scylla-monitor"]], "Install Alertmanager": [[7, "install-alertmanager"]], "Install Prometheus": [[7, "install-prometheus"]], "Install Grafana": [[7, "install-grafana"]], "Monitoring Interfaces": [[8, "monitoring-interfaces"]], "Prometheus": [[8, "prometheus"]], "Troubleshoot Monitoring": [[6, "troubleshoot-monitoring"]], "Problem": [[6, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[6, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[6, "a-container-fails-to-start"]], "Files And Directory Permissions": [[6, "files-and-directory-permissions"]], "No Data Points": [[6, "no-data-points"]], "Solution": [[6, "solution"], [6, "id1"], [6, "id2"], [6, "id3"]], "Grafana Chart Shows Error (!) Sign": [[6, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[6, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[6, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[6, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[6, "working-with-wireshark"]], "The start-all.sh command": [[10, "the-start-all-sh-command"]], "General Options": [[10, "general-options"]], "Grafana Related Commands": [[10, "grafana-related-commands"]], "Grafana LDAP support": [[10, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[10, "prometheus-related-commands"]], "Prometheus Retention Period": [[10, "prometheus-retention-period"]], "Alert Manager": [[10, "alert-manager"]], "Install Scylla Monitoring Stack": [[9, "install-scylla-monitoring-stack"]], "Prerequisites": [[9, "prerequisites"]], "Docker Post Installation": [[9, "docker-post-installation"]], "Install Scylla Monitoring": [[9, "install-scylla-monitoring"]], "Configure Scylla Monitoring": [[9, "configure-scylla-monitoring"]], "Configure Scylla nodes from files": [[9, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[9, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[9, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[9, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[9, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[9, "start-and-stop-scylla-monitoring-stack"]], "Start": [[9, "start"]], "Stop": [[9, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[9, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[9, "accessing-the-localhost"]], "View Grafana Dashboards": [[9, "view-grafana-dashboards"]], "Adding and Modifying Dashboards": [[11, "adding-and-modifying-dashboards"]], "General Limitations": [[11, "general-limitations"]], "consistency between restarts": [[11, "consistency-between-restarts"]], "consistency between upgrades": [[11, "consistency-between-upgrades"]], "Using templated Dashboards": [[11, "using-templated-dashboards"]], "The template class system": [[11, "the-template-class-system"]], "Panel example": [[11, "panel-example"]], "Grafana Formats and Layouts": [[11, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[11, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "prerequisite": [[11, "prerequisite"]], "Validation": [[11, "validation"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.5/sitemap.xml b/branch-3.5/sitemap.xml new file mode 100644 index 000000000..20c4498ef --- /dev/null +++ b/branch-3.5/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.5/start_all.html b/branch-3.5/start_all.html new file mode 100644 index 000000000..d93e2cedf --- /dev/null +++ b/branch-3.5/start_all.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          The start-all.sh command

          +

          Scylla Monitor is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

          +

          The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

          +
          +

          General Options

          +

          -h Help, Print the help, and exit.

          +

          –version print the current Scylla-Monitoring stack version, and exit.

          +

          -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

          +

          -A bind-to-ip-address Bind the listening-address to an explicit IP address.

          +

          -D encapsulate docker param Allows passing additional parameters to all the docker containers.

          +
          + + +
          +

          Alert Manager

          +

          alertmanager handles the alerts and takes the following parameters:

          +

          -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

          +

          -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

          +

          -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/updating_dashboard.html b/branch-3.5/updating_dashboard.html new file mode 100644 index 000000000..1ac359198 --- /dev/null +++ b/branch-3.5/updating_dashboard.html @@ -0,0 +1,893 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Adding and Modifying Dashboards

          +

          The following document explains how to update or create Grafana dashboards for the Scylla Monitor.

          +

          It will explain about Scylla Monitor dashboard templates and how to modify them.

          +
          +

          General Limitations

          +

          Scylla Monitor uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades.

          +
          +

          consistency between restarts

          +

          By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitor (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana.

          +
          +
          +

          consistency between upgrades

          +

          As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

          +
          +

          Note

          +

           You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided.

          +
          +

          At large, we suggest maintaining your dashboards as files, as Scylla Monitor does.

          +
          +
          +
          +

          Using templated Dashboards

          +

          Why does Scylla Monitor use dashboard templates?

          +

          We found the Grafana dashboards Json format too verbose to be maintainable.

          +

          Each element in the dashboard file (Each Json object) contains all of its attributes and values.

          +

          For example a typical graph panel would look like:

          +
          {
          +    "aliasColors": {},
          +    "bars": false,
          +    "datasource": "prometheus",
          +    "editable": true,
          +    "error": false,
          +    "fill": 0,
          +    "grid": {
          +        "threshold1": null,
          +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
          +        "threshold2": null,
          +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
          +    },
          +    "gridPos": {
          +        "h": 6,
          +        "w": 10,
          +        "x": 0,
          +        "y": 4
          +    },
          +    "id": 2,
          +    "isNew": true,
          +    "legend": {
          +        "avg": false,
          +        "current": false,
          +        "max": false,
          +        "min": false,
          +        "show": false,
          +        "total": false,
          +        "values": false
          +    },
          +    "lines": true,
          +    "linewidth": 2,
          +    "links": [],
          +    "nullPointMode": "connected",
          +    "percentage": false,
          +    "pointradius": 5,
          +    "points": false,
          +    "renderer": "flot",
          +    "seriesOverrides": [
          +        {}
          +    ],
          +    "span": 5,
          +    "stack": false,
          +    "steppedLine": false,
          +    "targets": [
          +        {
          +            "expr": "sum(node_filesystem_avail) by (instance)",
          +            "intervalFactor": 1,
          +            "legendFormat": "",
          +            "refId": "A",
          +            "step": 1
          +        }
          +    ],
          +    "timeFrom": null,
          +    "timeShift": null,
          +    "title": "Available Disk Size",
          +    "tooltip": {
          +        "msResolution": false,
          +        "shared": true,
          +        "sort": 0,
          +        "value_type": "cumulative"
          +    },
          +    "transparent": false,
          +    "type": "graph",
          +    "xaxis": {
          +        "show": true
          +    },
          +    "yaxes": [
          +        {
          +            "format": "percent",
          +            "logBase": 1,
          +            "max": 101,
          +            "min": 0,
          +            "show": true
          +        },
          +        {
          +            "format": "short",
          +            "logBase": 1,
          +            "max": null,
          +            "min": null,
          +            "show": true
          +        }
          +    ]
          +}
          +
          +
          +

          As you can imagine, most panels would have similar values.

          +

          To reduce the redundancy of Grafana JSON format, we added dashboard templates.

          +
          +

          The template class system

          +

          Scylla Monitor dashboard templates use class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

          +

          The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes.

          +

          In the template file, you can also add or override attributes.

          +

          The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

          +

          When generating dashboards, each class will be replaced by its definition.

          +

          For example row in the type.json defined

          +
          {
          + "base_row": {
          +     "collapse": false,
          +     "editable": true
          + },
          + "row": {
          +     "class": "base_row",
          +     "height": "250px"
          + }
          + }
          +
          +
          +

          In a Template it will be used like

          +
          {
          +     "class": "row",
          +     "height": "150px",
          +     "panels": [
          +     ]
          +}
          +
          +
          +

          The output will be

          +
          {
          +     "class": "row",
          +     "collapse": false,
          +     "editable": true,
          +     "height": "150px",
          +     "panels": [
          +
          +     ]
          +}
          +
          +
          +

          We can see that the template added the panels attribute and override the height attribute.

          +
          +
          +

          Panel example

          +

          Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

          +
          {
          +     "class": "row",
          +     "panels": [
          +         {
          +             "class": "bytes_panel",
          +             "span": 3,
          +             "targets": [
          +                 {
          +                     "expr": "sum(node_filesystem_avail) by (instance)",
          +                     "intervalFactor": 1,
          +                     "legendFormat": "",
          +                     "metric": "",
          +                     "refId": "A",
          +                     "step": 1
          +                 }
          +             ],
          +             "title": "Available Disk Size"
          +         }
          +     ]
          +}
          +
          +
          +

          In the example, we used the bytes_panel class that generate a graph with bytes as units (that would mean that your +Y axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’)

          +

          You can also see that we override the span attribute to set the panel size.

          +

          To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

          +
          +
          +

          Grafana Formats and Layouts

          +

          The Grafana layout used to be based on rows, where each contains multiple panels. +Each row would have a total span of 12, if the total span of the panels be larger than 12, it would +break the lines into multiple lines.

          +

          Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width).

          +

          The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

          +

          To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

          +

          Panels height will be taken from their row. The span attribute is stil supported like you expect it to work, so does row height.

          +

          you can use the gridPos attribute which is a Grafana 5.0 format, but not like Grafana, you can use partial attributes.

          +

          gridPos has the following attributes:

          +
          {
          +   "x": 0,
          +   "y": 0,
          +   "w": 24,
          +   "h": 4
          + }
          +
          +
          +

          When using Scylla’s template you don’t need to supply them all, so for example to specify that a row is 2 units height you can use:

          +
          {
          +   "gridPos": {
          +      "h": 2
          +    }
          +}
          +
          +
          +
          +
          +

          Generating the dashboards from templates (generate-dashboards.sh)

          +
          +

          prerequisite

          +

          Python 2.7

          +

          make_dashboards.py is a utility that generates dashboards from templates or help you update the template when working in reverse mode (the -r flag).

          +

          Use the -h flag to get help information.

          +

          You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

          +

          When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +this will replace your existing dashboards.

          +

          For example, if you are changing a dashboard in Scylla Enterprise version 2018.1 run:

          +

          .\generate-dashboards.sh -v 2018.1

          +
          +

          Note

          +

          generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard.

          +
          +
          +
          +
          +

          Validation

          +

          After making changes to a template, run the generate_generate-dashboards.sh you should see that it run without any errors.

          +

          Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

          +
          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.6/.buildinfo b/branch-3.6/.buildinfo new file mode 100644 index 000000000..7ad0ffcf2 --- /dev/null +++ b/branch-3.6/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: df2b054cd3ac468ccf7bf02222c4db5f +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-3.6/.doctrees/_common/monitor-description.doctree b/branch-3.6/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..69b5c9308 Binary files /dev/null and b/branch-3.6/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-3.6/.doctrees/advisor.doctree b/branch-3.6/.doctrees/advisor.doctree new file mode 100644 index 000000000..80801e90d Binary files /dev/null and b/branch-3.6/.doctrees/advisor.doctree differ diff --git a/branch-3.6/.doctrees/alerting.doctree b/branch-3.6/.doctrees/alerting.doctree new file mode 100644 index 000000000..54f5026bf Binary files /dev/null and b/branch-3.6/.doctrees/alerting.doctree differ diff --git a/branch-3.6/.doctrees/cql_optimization.doctree b/branch-3.6/.doctrees/cql_optimization.doctree new file mode 100644 index 000000000..20179236c Binary files /dev/null and b/branch-3.6/.doctrees/cql_optimization.doctree differ diff --git a/branch-3.6/.doctrees/docker_compose.doctree b/branch-3.6/.doctrees/docker_compose.doctree new file mode 100644 index 000000000..dd94c573c Binary files /dev/null and b/branch-3.6/.doctrees/docker_compose.doctree differ diff --git a/branch-3.6/.doctrees/environment.pickle b/branch-3.6/.doctrees/environment.pickle new file mode 100644 index 000000000..8da79338d Binary files /dev/null and b/branch-3.6/.doctrees/environment.pickle differ diff --git a/branch-3.6/.doctrees/index.doctree b/branch-3.6/.doctrees/index.doctree new file mode 100644 index 000000000..cf41ba896 Binary files /dev/null and b/branch-3.6/.doctrees/index.doctree differ diff --git a/branch-3.6/.doctrees/matrix.doctree b/branch-3.6/.doctrees/matrix.doctree new file mode 100644 index 000000000..cc9a3b75f Binary files /dev/null and b/branch-3.6/.doctrees/matrix.doctree differ diff --git a/branch-3.6/.doctrees/min-prod-hw.doctree b/branch-3.6/.doctrees/min-prod-hw.doctree new file mode 100644 index 000000000..12bccad6a Binary files /dev/null and b/branch-3.6/.doctrees/min-prod-hw.doctree differ diff --git a/branch-3.6/.doctrees/monitor_troubleshoot.doctree b/branch-3.6/.doctrees/monitor_troubleshoot.doctree new file mode 100644 index 000000000..4cddab0c6 Binary files /dev/null and b/branch-3.6/.doctrees/monitor_troubleshoot.doctree differ diff --git a/branch-3.6/.doctrees/monitor_without_docker.doctree b/branch-3.6/.doctrees/monitor_without_docker.doctree new file mode 100644 index 000000000..aa063e31a Binary files /dev/null and b/branch-3.6/.doctrees/monitor_without_docker.doctree differ diff --git a/branch-3.6/.doctrees/monitoring_apis.doctree b/branch-3.6/.doctrees/monitoring_apis.doctree new file mode 100644 index 000000000..fa159b6ac Binary files /dev/null and b/branch-3.6/.doctrees/monitoring_apis.doctree differ diff --git a/branch-3.6/.doctrees/monitoring_stack.doctree b/branch-3.6/.doctrees/monitoring_stack.doctree new file mode 100644 index 000000000..b3ce7aacc Binary files /dev/null and b/branch-3.6/.doctrees/monitoring_stack.doctree differ diff --git a/branch-3.6/.doctrees/start_all.doctree b/branch-3.6/.doctrees/start_all.doctree new file mode 100644 index 000000000..f228675f0 Binary files /dev/null and b/branch-3.6/.doctrees/start_all.doctree differ diff --git a/branch-3.6/.doctrees/thanos.doctree b/branch-3.6/.doctrees/thanos.doctree new file mode 100644 index 000000000..c3a409047 Binary files /dev/null and b/branch-3.6/.doctrees/thanos.doctree differ diff --git a/branch-3.6/.doctrees/updating_dashboard.doctree b/branch-3.6/.doctrees/updating_dashboard.doctree new file mode 100644 index 000000000..836b20633 Binary files /dev/null and b/branch-3.6/.doctrees/updating_dashboard.doctree differ diff --git a/branch-3.6/.nojekyll b/branch-3.6/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-3.6/404.html b/branch-3.6/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-3.6/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
          +

          404

          +

          The ScyllaDB monster ate your page!

          +

          + Home +

          +
          + + + \ No newline at end of file diff --git a/branch-3.6/CNAME b/branch-3.6/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-3.6/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-3.6/_common/monitor-description.html b/branch-3.6/_common/monitor-description.html new file mode 100644 index 000000000..761572e07 --- /dev/null +++ b/branch-3.6/_common/monitor-description.html @@ -0,0 +1,608 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +

          Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

          + + +
          + + + + + +
          + + +
          + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.6/_images/1.png b/branch-3.6/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.6/_images/1.png differ diff --git a/branch-3.6/_images/2.png b/branch-3.6/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.6/_images/2.png differ diff --git a/branch-3.6/_images/3.png b/branch-3.6/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.6/_images/3.png differ diff --git a/branch-3.6/_images/advisor_panel.png b/branch-3.6/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-3.6/_images/advisor_panel.png differ diff --git a/branch-3.6/_images/alertmanager.png b/branch-3.6/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.6/_images/alertmanager.png differ diff --git a/branch-3.6/_images/cql_optimization_master.png b/branch-3.6/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.6/_images/cql_optimization_master.png differ diff --git a/branch-3.6/_images/grafana.png b/branch-3.6/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.6/_images/grafana.png differ diff --git a/branch-3.6/_images/monitor.png b/branch-3.6/_images/monitor.png new file mode 100644 index 000000000..56c383e46 Binary files /dev/null and b/branch-3.6/_images/monitor.png differ diff --git a/branch-3.6/_images/monitoring_stack.png b/branch-3.6/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.6/_images/monitoring_stack.png differ diff --git a/branch-3.6/_sources/_common/monitor-description.rst.txt b/branch-3.6/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-3.6/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.6/_sources/advisor.rst.txt b/branch-3.6/_sources/advisor.rst.txt new file mode 100644 index 000000000..ecbaad29d --- /dev/null +++ b/branch-3.6/_sources/advisor.rst.txt @@ -0,0 +1,21 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ +.. figure:: advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. \ No newline at end of file diff --git a/branch-3.6/_sources/alerting.rst.txt b/branch-3.6/_sources/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.6/_sources/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.6/_sources/cql_optimization.rst.txt b/branch-3.6/_sources/cql_optimization.rst.txt new file mode 100644 index 000000000..eafc82e4b --- /dev/null +++ b/branch-3.6/_sources/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-3.6/_sources/docker_compose.rst.txt b/branch-3.6/_sources/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-3.6/_sources/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-3.6/_sources/index.rst.txt b/branch-3.6/_sources/index.rst.txt new file mode 100644 index 000000000..63fa77814 --- /dev/null +++ b/branch-3.6/_sources/index.rst.txt @@ -0,0 +1,53 @@ +Scylla Monitoring Stack +======================= + +.. toctree:: + :hidden: + :maxdepth: 2 + + Install Scylla Monitoring Stack + The start-all.sh script + Running using Docker Compose + Scylla Monitoring Stack Interfaces + Deploy Scylla Monitoring Stack Without Docker + Troubleshoot the Monitoring Stack + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + Upgrade Guide for Scylla Monitor + CQL Optimization Dashboard + Scylla Monitoring Stack Advisor + Adding and Modifying Dashboards + Alerting + Using Thanos + Scylla Monitoring Stack Support Matrix + + +.. include:: /_common/monitor-description.rst + +For older versions of Scylla Monitoring Stack see `here `_. + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Running using Docker Compose ` +* :doc:`Scylla Monitoring Stack Interfaces ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Troubleshoot Scylla Monitoring Stack ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitoring Stack Integration `_ +* `Upgrade Guide for Scylla Monitoring Stack `_ +* :doc:`Scylla Monitoring Stack Advisor ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Alerting ` +* :doc:`Using Thanos ` +* :doc:`Scylla Monitoring Stack Support Matrix ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + diff --git a/branch-3.6/_sources/matrix.rst.txt b/branch-3.6/_sources/matrix.rst.txt new file mode 100644 index 000000000..22cd230d2 --- /dev/null +++ b/branch-3.6/_sources/matrix.rst.txt @@ -0,0 +1,90 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.6.3 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.0 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.6/_sources/min-prod-hw.rst.txt b/branch-3.6/_sources/min-prod-hw.rst.txt new file mode 100644 index 000000000..db5d9c860 --- /dev/null +++ b/branch-3.6/_sources/min-prod-hw.rst.txt @@ -0,0 +1,24 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need **minimal** disk space of + +.. code:: + + 6 * 16 * 200MB ~ 20GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. diff --git a/branch-3.6/_sources/monitor_troubleshoot.rst.txt b/branch-3.6/_sources/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..2cc1457ea --- /dev/null +++ b/branch-3.6/_sources/monitor_troubleshoot.rst.txt @@ -0,0 +1,225 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +.. contents:: + :depth: 1 + :local: + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.6/_sources/monitor_without_docker.rst.txt b/branch-3.6/_sources/monitor_without_docker.rst.txt new file mode 100644 index 000000000..85e9a2db9 --- /dev/null +++ b/branch-3.6/_sources/monitor_without_docker.rst.txt @@ -0,0 +1,378 @@ +Deploying Scylla Monitoring Stack Without Docker +================================================ + +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. The current monitoring solution does not churn data. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +``wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz`` + + +2. Open the tar + +``tar -xvf scylla-monitoring-3.5.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.20.0 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz + tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.20.0.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + + +Install Prometheus +------------------ + +Tested with Prometheus version 2.18.1 + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz + tar -xvf prometheus-2.18.1.linux-amd64.tar.gz + +2. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64 + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml + + +3. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi prometheus-2.18.1.linux-amd64/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +4. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:56090 + +5. Create a data directory for Prometheus to store the metrics data + +For example: + +.. code-block:: shell + + mkdir prometheus-2.18.1.linux-amd64/mydata + + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + + cd prometheus-2.18.1.linux-amd64 + ./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata + +Data should start accumulate on: ./mydata + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + + +Install Grafana +--------------- + +Tested with Grafna 6.7.3 + +1. Install Grafana based on the instructions `here`_ make sure to use version 6.7.0 or higher + +.. _`here` : http://docs.grafana.org/installation/ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +``cd scylla-monitoring-scylla-monitoring-3.5/`` + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-6.7.3/public/app + +4. Provision the Dashboard them + +For example Scylla version 4.0 and Scylla manager version 2.0 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-6.7.3/public/build/ + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-6.7.3/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.0.yaml`` would point to: ``/home/centos/grafana-6.7.3/public/build/ver_4.0`` and the FOLDER will be ``4.0`` + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-6.7.3/data/plugins + provisioning = /home/centos/grafana-6.7.3/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-6.7.3/ + ./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + diff --git a/branch-3.6/_sources/monitoring_apis.rst.txt b/branch-3.6/_sources/monitoring_apis.rst.txt new file mode 100644 index 000000000..6d64821bc --- /dev/null +++ b/branch-3.6/_sources/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see `Scylla Monitoring Stack `_ + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.6/_sources/monitoring_stack.rst.txt b/branch-3.6/_sources/monitoring_stack.rst.txt new file mode 100644 index 000000000..9d00ebb68 --- /dev/null +++ b/branch-3.6/_sources/monitoring_stack.rst.txt @@ -0,0 +1,355 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +.. contents:: + :depth: 2 + :local: + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API`_. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +.. _`Scylla Prometheus API`: monitoring_apis#prometheus + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can `Deploy Scylla Monitoring Stack Without Docker `_ . + +.. _`docker`: https://docs.docker.com/install/ + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout branch-3.6 + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://scylladb.github.io/scylla-manager/2.2/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-3.6/_sources/start_all.rst.txt b/branch-3.6/_sources/start_all.rst.txt new file mode 100644 index 000000000..752a98a12 --- /dev/null +++ b/branch-3.6/_sources/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh command +======================== + +Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "-storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.6/_sources/thanos.rst.txt b/branch-3.6/_sources/thanos.rst.txt new file mode 100644 index 000000000..ffaf430af --- /dev/null +++ b/branch-3.6/_sources/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912 + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903 + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + \ No newline at end of file diff --git a/branch-3.6/_sources/updating_dashboard.rst.txt b/branch-3.6/_sources/updating_dashboard.rst.txt new file mode 100644 index 000000000..5113102a8 --- /dev/null +++ b/branch-3.6/_sources/updating_dashboard.rst.txt @@ -0,0 +1,302 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It will explain about Scylla Monitoring Stack dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades. + +consistency between restarts +**************************** + +By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana. + +consistency between upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitor does. + + +Using templated Dashboards +########################## +Why does Scylla Monitor use dashboard templates? + +We found the Grafana dashboards Json format too verbose to be maintainable. + +Each element in the dashboard file (Each Json object) contains all of its attributes and values. + +For example a typical graph panel would look like: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of Grafana JSON format, we added dashboard templates. + +The template class system +*************************** + +Scylla Monitoring Stack dashboard templates use ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example row in the `type.json` defined + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +In a Template it will be used like + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +The output will be + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and override the ``height`` attribute. + + +Panel example +************* + +Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, we used the `bytes_panel` class that generate a graph with bytes as units (that would mean that your +`Y` axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc') + +You can also see that we override the `span` attribute to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +you can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` you should see that it run without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.6/_static/basic.css b/branch-3.6/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.6/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.6/_static/check-solid.svg b/branch-3.6/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.6/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.6/_static/clipboard.min.js b/branch-3.6/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.6/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.6/_static/copybutton.css b/branch-3.6/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.6/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

          Short

          + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.6/_static/copybutton.js b/branch-3.6/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.6/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.6/_static/copybutton_funcs.js b/branch-3.6/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.6/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.6/_static/css/main.css b/branch-3.6/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-3.6/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.6/_static/doctools.js b/branch-3.6/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.6/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.6/_static/documentation_options.js b/branch-3.6/_static/documentation_options.js new file mode 100644 index 000000000..237299273 --- /dev/null +++ b/branch-3.6/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.3.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.6/_static/file.png b/branch-3.6/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.6/_static/file.png differ diff --git a/branch-3.6/_static/img/banner-background.svg b/branch-3.6/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.6/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.6/_static/img/favicon-228x228.png b/branch-3.6/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.6/_static/img/favicon-228x228.png differ diff --git a/branch-3.6/_static/img/favicon-32x32.png b/branch-3.6/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.6/_static/img/favicon-32x32.png differ diff --git a/branch-3.6/_static/img/favicon.ico b/branch-3.6/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.6/_static/img/favicon.ico differ diff --git a/branch-3.6/_static/img/icons/icon-about-team.svg b/branch-3.6/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.6/_static/img/icons/icon-about-us-m.svg b/branch-3.6/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-about-us.svg b/branch-3.6/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-alternator.svg b/branch-3.6/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-apps.svg b/branch-3.6/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-architecture.svg b/branch-3.6/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.6/_static/img/icons/icon-benchmarks.svg b/branch-3.6/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.6/_static/img/icons/icon-blog.svg b/branch-3.6/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.6/_static/img/icons/icon-careers.svg b/branch-3.6/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.6/_static/img/icons/icon-chevron-left.svg b/branch-3.6/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.6/_static/img/icons/icon-chevron-right.svg b/branch-3.6/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.6/_static/img/icons/icon-circe.svg b/branch-3.6/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-clock.svg b/branch-3.6/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-close.svg b/branch-3.6/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-cloud-docs.svg b/branch-3.6/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-cloud.svg b/branch-3.6/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-comparison.svg b/branch-3.6/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.6/_static/img/icons/icon-contact-us.svg b/branch-3.6/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.6/_static/img/icons/icon-developers-blog.svg b/branch-3.6/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.6/_static/img/icons/icon-docs.svg b/branch-3.6/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.6/_static/img/icons/icon-enterprise-m.svg b/branch-3.6/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-enterprise.svg b/branch-3.6/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-events.svg b/branch-3.6/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.6/_static/img/icons/icon-exclamation.svg b/branch-3.6/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-expand.svg b/branch-3.6/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-forum.svg b/branch-3.6/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-getting-started.svg b/branch-3.6/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-glossary.svg b/branch-3.6/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-home.svg b/branch-3.6/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-infoworld.svg b/branch-3.6/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.6/_static/img/icons/icon-integrations.svg b/branch-3.6/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-knowledge-base.svg b/branch-3.6/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-less.svg b/branch-3.6/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-live-test.svg b/branch-3.6/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.6/_static/img/icons/icon-mail-list.svg b/branch-3.6/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-manager.svg b/branch-3.6/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.6/_static/img/icons/icon-memory-management.svg b/branch-3.6/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.6/_static/img/icons/icon-modeling.svg b/branch-3.6/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-monitoring.svg b/branch-3.6/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.6/_static/img/icons/icon-networking.svg b/branch-3.6/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.6/_static/img/icons/icon-news.svg b/branch-3.6/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.6/_static/img/icons/icon-newsletter.svg b/branch-3.6/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.6/_static/img/icons/icon-nsql-guides.svg b/branch-3.6/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.6/_static/img/icons/icon-open-source.svg b/branch-3.6/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.6/_static/img/icons/icon-operator.svg b/branch-3.6/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-overview.svg b/branch-3.6/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.6/_static/img/icons/icon-partners.svg b/branch-3.6/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.6/_static/img/icons/icon-plus.svg b/branch-3.6/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-pricing.svg b/branch-3.6/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.6/_static/img/icons/icon-release-notes.svg b/branch-3.6/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.6/_static/img/icons/icon-resource-center.svg b/branch-3.6/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.6/_static/img/icons/icon-roadmap.svg b/branch-3.6/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.6/_static/img/icons/icon-search.svg b/branch-3.6/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.6/_static/img/icons/icon-slack.svg b/branch-3.6/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-stack-overflow.svg b/branch-3.6/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.6/_static/img/icons/icon-summit.svg b/branch-3.6/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-support.svg b/branch-3.6/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.6/_static/img/icons/icon-tech-talks.svg b/branch-3.6/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.6/_static/img/icons/icon-testing.svg b/branch-3.6/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.6/_static/img/icons/icon-thumbs-down.svg b/branch-3.6/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-thumbs-up.svg b/branch-3.6/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-tip.svg b/branch-3.6/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.6/_static/img/icons/icon-training.svg b/branch-3.6/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.6/_static/img/icons/icon-triangle-down.svg b/branch-3.6/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.6/_static/img/icons/icon-university.svg b/branch-3.6/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.6/_static/img/icons/icon-users-blog.svg b/branch-3.6/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.6/_static/img/icons/icon-warning.svg b/branch-3.6/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-webinars.svg b/branch-3.6/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.6/_static/img/icons/icon-whitepapers.svg b/branch-3.6/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.6/_static/img/icons/icon-workshop.svg b/branch-3.6/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/logo-docs.svg b/branch-3.6/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.6/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.6/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.6/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.6/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.6/_static/img/mascots/404.jpg b/branch-3.6/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.6/_static/img/mascots/404.jpg differ diff --git a/branch-3.6/_static/img/mascots/scylla-3monsters.png b/branch-3.6/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.6/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-alternator.svg b/branch-3.6/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.6/_static/img/mascots/scylla-cloud.svg b/branch-3.6/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.6/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.6/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-computer-headset.png b/branch-3.6/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-cup-number-one.png b/branch-3.6/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-docs.svg b/branch-3.6/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.6/_static/img/mascots/scylla-drivers.svg b/branch-3.6/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.6/_static/img/mascots/scylla-enterprise.svg b/branch-3.6/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.6/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.6/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-forklift-migration.png b/branch-3.6/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-gear.png b/branch-3.6/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-hardhat.png b/branch-3.6/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-headband.png b/branch-3.6/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-headset.png b/branch-3.6/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-hearts.png b/branch-3.6/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-looking-down.png b/branch-3.6/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-looking-up.png b/branch-3.6/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.6/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.6/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-manager.svg b/branch-3.6/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.6/_static/img/mascots/scylla-monitor.svg b/branch-3.6/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.6/_static/img/mascots/scylla-movement-fast.png b/branch-3.6/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-movement.png b/branch-3.6/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-onpremise.png b/branch-3.6/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-opensource.svg b/branch-3.6/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.6/_static/img/mascots/scylla-operator.svg b/branch-3.6/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.6/_static/img/mascots/scylla-plugin.png b/branch-3.6/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-release-mascot.png b/branch-3.6/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-repair.png b/branch-3.6/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-server.png b/branch-3.6/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-sleeping.png b/branch-3.6/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-tall-measure.png b/branch-3.6/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-university.png b/branch-3.6/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-weights.png b/branch-3.6/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-window-cleaning.png b/branch-3.6/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-with-computer-2.png b/branch-3.6/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-with-computer.png b/branch-3.6/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-with-linux.png b/branch-3.6/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-writting.png b/branch-3.6/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.6/_static/img/menu.svg b/branch-3.6/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.6/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.6/_static/img/scylla-monitor.png b/branch-3.6/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.6/_static/img/scylla-monitor.png differ diff --git a/branch-3.6/_static/js/main.bundle.js b/branch-3.6/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-3.6/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
        • Back
        • ',backButtonPosition:"top",wrapper:"
          ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
            "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
            ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
            ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
            ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
            ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
            "],col:[2,"","
            "],tr:[2,"","
            "],td:[3,"","
            "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Scylla Monitoring Stack Advisor

            +

            The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them.

            +
            +

            The Advisor section

            +
            +_images/advisor_panel.png +
            +

            The Advisor section

            +
            +
            +

            The Advisor section is located on the Overview dashboard and consists of two parts:

            +

            On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

            +

            For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

            +

            On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

            +

            For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/alerting.html b/branch-3.6/alerting.html new file mode 100644 index 000000000..f20e6a8ac --- /dev/null +++ b/branch-3.6/alerting.html @@ -0,0 +1,699 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Alerting

            +

            Alerts are a Prometheus enhancement to notify that something is wrong in the system.

            +

            You can read more about Prometheus alerting here

            +

            By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

            +

            In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

            +

            The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

            +_images/monitoring_stack.png +
            +

            Prometheus Alerts

            +

            The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

            +

            Each alert consists of:

            +
              +
            • Name

            • +
            • What happened

            • +
            • For how long

            • +
            • What to report

            • +
            +

            For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

            +
            - alert: InstanceDown
            +  expr: up == 0
            +  for: 60s
            +  labels:
            +    severity: "2"
            +  annotations:
            +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
            +    summary: Instance {{ $labels.instance }} down
            +
            +
            +

            The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

            +

            The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

            +

            The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

            +

            annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

            +
            +
            +

            Alertmanager

            +

            The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

            +

            The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

            +
              +
            • Routes: Represent a routing tree, the most specific rule, wins

            • +
            • Inhibition: Mute an alert, based on another alert

            • +
            • Receiver: Send a notification via email, sluck, etc’

            • +
            +

            Check the Alertmanager documentation for details on how to specify a specific receiver.

            +

            In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

            +
            +
            +

            Tips When Adding an Alert

            +

            It’s worse having an alert that does not work, than not having an alert at all

            +

            There are multiple ways you can use to make sure your alert is set correctly:

            +
              +
            • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

            • +
            • Force the alert to be active by reducing the limits or the duration.

            • +
            • When possible simulate the actual scenario and see that the alert works as expected.

            • +
            +

            For example, low available disk space.

            +

            Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

            +

            Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

            +

            Starting with a simple working expression helps you bisect problems.

            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/cql_optimization.html b/branch-3.6/cql_optimization.html new file mode 100644 index 000000000..9839bab2b --- /dev/null +++ b/branch-3.6/cql_optimization.html @@ -0,0 +1,750 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            The CQL Optimization

            +

            The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver.

            +
            +_images/cql_optimization_master.png +
            +

            The CQL Dashboard

            +
            +
            +

            The upper part of the dashboard holds CQL related metrics.

            +

            The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

            +
            +

            Note

            +

            Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

            +
            +

            The following sections describe each of the dashboard’s panel

            +
            +

            Prepared Statements

            +

            Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

            +

            Using prepared statements has the following benefits:

            +
              +
            • The database only needs to parse the query once

            • +
            • The driver can route the query to the right node

            • +
            • Using place-holders and values is safer and prevents CQL-Injection

            • +
            +

            The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

            +

            The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

            +
            +
            +

            Token Aware

            +

            Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

            +

            Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

            +

            The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

            +

            The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

            +
            +
            +

            Paged Queries

            +

            By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

            +

            The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

            +

            The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

            +
            +
            +

            Reversed CQL Reads

            +

            Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

            +

            Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

            +

            For example, look at the following table:

            +
            CREATE TABLE ks1.table_demo (
            +   category text,
            +   type int,
            +   PRIMARY KEY (category, type))
            +WITH CLUSTERING ORDER BY (type DESC);
            +
            +
            +

            The following query uses reverse order:

            +
            select * from ks1.table_demo where category='cat1' order by type ASC;
            +
            +
            +

            The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

            +

            The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

            +
            +
            +

            ALLOW FILTERING

            +

            Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

            +

            These kinds of queries can create a big load on the system, and should be used with care.

            +

            The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

            +

            The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

            +

            The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

            +

            The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

            +

            The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

            +
            +
            +

            Consistency Level

            +

            Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

            +

            The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

            +

            Two consistency levels hold a potential problem and should be used with care ANY and ALL.

            +

            The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

            +

            The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

            +

            The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

            +

            The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

            +
            +
            +

            Cross DC

            +

            Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

            +
            +
            +

            Cross DC Consistency Level

            +

            Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

            +
            +
            +

            Cross DC read requests

            +
            +

            Note

            +

            The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

            +
            +

            In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

            +

            The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/docker_compose.html b/branch-3.6/docker_compose.html new file mode 100644 index 000000000..3a6c3e610 --- /dev/null +++ b/branch-3.6/docker_compose.html @@ -0,0 +1,766 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Using Docker Compose

            +

            Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

            +

            Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

            +
            +

            Warning

            +

            docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

            +
            +
            +

            Prerequisite

            +

            Make sure you have docker and docker-compose installed.

            +
            +
            +

            Setting Prometheus

            +

            The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

            +

            You can use ./prometheus-config.sh to generate the file, for example:

            +
            ./prometheus-config.sh --compose
            +
            +
            +

            For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

            +
            +
            +

            Setting Grafana Provisioning

            +

            Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

            +
            +

            Grafana Data-Source file

            +

            Run the following command to update the datasource:

            +
            ./grafana-datasource.sh --compose
            +
            +
            +

            You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

            +
            +
            +

            Grafana Dashboard Load file

            +

            To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

            +
            ./generate-dashboards.sh -t -v 2020.1
            +
            +
            +

            This command generates the files under: grafana/provisioning/dashboards/

            +
            +
            +
            +

            Docker Compose file

            +

            You can use the following example as a base for your docker compose.

            +

            Pass the following to a file called docker-compose.yml

            +
            services:
            +  alertmanager:
            +    container_name: aalert
            +    image: prom/alertmanager:v0.21.0
            +    ports:
            +    - 9093:9093
            +    volumes:
            +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
            +  grafana:
            +    container_name: agraf
            +    environment:
            +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
            +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
            +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
            +    # This is where you set Grafana security
            +    - GF_AUTH_BASIC_ENABLED=false
            +    - GF_AUTH_ANONYMOUS_ENABLED=true
            +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
            +    - GF_SECURITY_ADMIN_PASSWORD=admin
            +    image: grafana/grafana:7.3.5
            +    ports:
            +    - 3000:3000
            +    user: 1000:1000
            +    volumes:
            +    - ./grafana/build:/var/lib/grafana/dashboards
            +    - ./grafana/plugins:/var/lib/grafana/plugins
            +    - ./grafana/provisioning:/var/lib/grafana/provisioning
            +    # Uncomment the following line for grafana persistency
            +    # - path/to/grafana/dir:/var/lib/grafana
            +  loki:
            +    command:
            +    - --config.file=/mnt/config/loki-config.yaml
            +    container_name: loki
            +    image: grafana/loki:2.0.0
            +    ports:
            +    - 3100:3100
            +    volumes:
            +    - ./loki/rules:/etc/loki/rules
            +    - ./loki/conf:/mnt/config
            +  promotheus:
            +    command:
            +    - --config.file=/etc/prometheus/prometheus.compose.yml
            +    container_name: aprom
            +    image: prom/prometheus:v2.18.1
            +    ports:
            +    - 9090:9090
            +    volumes:
            +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
            +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
            +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
            +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
            +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
            +    # Uncomment the following line for prometheus persistency 
            +    # - path/to/data/dir:/prometheus/data
            +  promtail:
            +    command:
            +    - --config.file=/etc/promtail/config.yml
            +    container_name: promtail
            +    image: grafana/promtail:2.0.0
            +    ports:
            +    - 1514:1514
            +    - 9080:9080
            +    volumes:
            +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
            +version: '3'
            +
            +
            +
            +

            Start and Stop

            +

            To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

            +
            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/genindex.html b/branch-3.6/genindex.html new file mode 100644 index 000000000..fbb14b395 --- /dev/null +++ b/branch-3.6/genindex.html @@ -0,0 +1,604 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + + + + + +
            + + + + + +
            + + +
            + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/index.html b/branch-3.6/index.html new file mode 100644 index 000000000..133fc4877 --- /dev/null +++ b/branch-3.6/index.html @@ -0,0 +1,639 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Scylla Monitoring Stack

            +
            +
            +

            Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

            +

            For older versions of Scylla Monitoring Stack see here.

            +_images/monitor.png +

            The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

            +
              +
            • prometheus - collects and stores metrics

            • +
            • alertmanager - handles alerts

            • +
            • grafana - dashboard server

            • +
            +

            Choose a topic to get started:

            + +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/matrix.html b/branch-3.6/matrix.html new file mode 100644 index 000000000..4b1777389 --- /dev/null +++ b/branch-3.6/matrix.html @@ -0,0 +1,717 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Scylla Monitoring Stack Support Matrix

            +

            The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

            + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

            Scylla Monitoring Stack Version

            Scylla Open Source Version

            Scylla Enterprise Version

            Node_exporter[1] Version

            Scylla Manager Version

            3.6.3

            4.1, 4.2, 4.3

            2019.1, 2020.1

            0.17

            2.1, 2.2, 2.3

            3.6.1

            4.1, 4.2, 4.3

            2019.1, 2020.1

            0.17

            2.1, 2.2

            3.6.0

            4.1, 4.2, 4.3, 4.4

            2019.1, 2020.1

            0.17

            2.1, 2.2

            3.5

            3.3, 4.0, 4.1, 4.2

            2019.1, 2020.1

            0.17

            2.0, 2.1, 2.2

            3.4.3

            3.3, 4.0, 4.1, 4.2

            2019.1, 2020.1

            0.17

            2.0, 2.1

            3.4

            3.3, 4.0, 4.1

            2018.1, 2019.1

            0.17

            2.0, 2.1

            3.3

            3.1, 3.2, 3.3, 4.0

            2018.1, 2019.1

            0.17

            1.4, 2.0, 2.1

            3.2

            3.1, 3.2, 3.3

            2018.1, 2019.1

            0.17

            1.4, 2.0

            3.1

            2.3, 3.0, 3.1, 3.2

            2018.1, 2019.1

            0.17

            1.3, 1.4, 2.0

            3.0

            2.3, 3.0, 3.1, 3.2

            2018.1, 2019.1

            0.17

            1.3, 1.4

            2.4

            2.3, 3.0, 3.1

            2018.1, 2019.1

            0.14, 0.17

            1.3, 1.4

            2.3

            2.3, 3.0

            2018.1, 2019.1

            0.14, 0.17

            1.3

            2.2

            2.3, 3.0

            2018.1, 2019.1

            0.14, 0.17

            1.3

            2.1

            2.3, 3.0

            2018.1

            0.14, 0.17

            1.3

            +

            [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/min-prod-hw.html b/branch-3.6/min-prod-hw.html new file mode 100644 index 000000000..cb2835f04 --- /dev/null +++ b/branch-3.6/min-prod-hw.html @@ -0,0 +1,631 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Minimal Production System Recommendations

            +
              +
            • CPU - at least 2 physical cores/ 4vCPUs

            • +
            • Memory - 15GB+ DRAM

            • +
            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

            • +
            • Network - 1GbE/10GbE preferred

            • +
            +
            +

            Calculating Prometheus Minimal Disk Space requirement

            +

            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

            +

            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

            +

            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

            +
            6 * 16 * 200MB ~ 20GB
            +
            +
            +

            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

            +
            +
            + + +
            + + + + + +
            + + +
            + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/monitor_troubleshoot.html b/branch-3.6/monitor_troubleshoot.html new file mode 100644 index 000000000..b17d307f8 --- /dev/null +++ b/branch-3.6/monitor_troubleshoot.html @@ -0,0 +1,829 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Troubleshoot Scylla Monitoring Stack

            +

            This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

            +
            +

            Problem

            + +
            +

            Scylla-Manager 2.2 with Duplicate information

            +

            Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

            +
              +
            • For Manager server: from 56090 to 5090

            • +
            • For Manager Agent: from 56090 to 5090

            • +
            +

            For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

            +

            However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

            +

            The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

            +

            Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

            +
            +
            +

            A Container Fails To Start

            +

            When running ./start-all.sh a container can fail to start. For example you can see the following error message:

            +
            Wait for Prometheus container to start........Error: Prometheus container failed to start
            +
            +
            +

            Should this happen, check the Docker logs for more information.

            +
            docker logs aprom
            +
            +
            +

            Usually the reason for the failure is described in the logs.

            +
            +
            +

            Files And Directory Permissions

            +
            +

            Note

            +

            Avoid running Docker containers as root.

            +
            +

            The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

            +

            If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

            +
            +

            Note

            +

            If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

            +
            +

            For example if your Prometheus data directory is /prom-data and you are using centos user

            +
            ls -la /|grep prom-data
            +
            +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
            +
            +sudo chown -R centos:centos /prom-data
            +
            +ls -la /|grep prom-data
            +
            +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
            +
            +
            +
            +
            +

            No Data Points

            +

            No data points on all data charts.

            +
            +

            Solution

            +

            If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

            +
              +
            1. Login to the Prometheus console:

            2. +
            3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

            4. +
            5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

            6. +
            +
            +
              +
            • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

            • +
            • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

            • +
            • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

            • +
            +
            +

            For example:

            +
            ./start-all.sh -v 3.1
            +
            +
            +

            More on start-all.sh options.

            +
            +
            +
            +

            Grafana Chart Shows Error (!) Sign

            +

            Run this procedure on the Scylla Monitoring Stack server.

            +

            If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

            +
            +

            Solution

            +

            On the Scylla Monitoring Stack server:

            +
              +
            1. Check Prometheus is running using docker ps.

            2. +
            +
              +
            • If it is not running check the prometheus.yml for errors.

            • +
            +

            For example:

            +
            CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
            +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
            +
            +
            +
              +
            • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

            • +
            +
            +
            +
            +

            Grafana Shows Server Level Metrics, but not Scylla Metrics

            +

            Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

            +
            +

            Solution

            +
              +
            • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

            • +
            +

            For example

            +
            curl 172.17.0.2:9180/metrics
            +
            +
            +
            +
            +
            +

            Grafana Shows Scylla Metrics, but not Server Level Metrics

            +

            Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

            +
            +

            Solution

            +

            1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

            +
              +
            1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

            2. +
            +
            +
            +

            Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

            +

            While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

            +

            If the node_exporter service is not starting it may need to be updated manually.

            +

            Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

            +
            +
            +
            +

            Working with Wireshark

            +

            No metrics shown in the Scylla Monitoring Stack.

            +
              +
            1. Install wireshark

            2. +
            +

            2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

            +

            For example:

            +
            tshark -i eth0 -f "dst port 9180"
            +
            +
            +

            Capture from Scylla node towards Scylla Monitoring Stack server.

            +

            In this example, Scylla is running.

            +
            Monitor ip        Scylla node ip
            +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
            +
            +
            +

            In this example, Scylla is not running

            +
            Monitor ip        Scylla node ip
            +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
            +
            +
            +
            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/monitor_without_docker.html b/branch-3.6/monitor_without_docker.html new file mode 100644 index 000000000..0f742e75c --- /dev/null +++ b/branch-3.6/monitor_without_docker.html @@ -0,0 +1,957 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Deploying Scylla Monitoring Stack Without Docker

            +

            The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

            +

            Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

            +
            +

            Minimal Production System Recommendations

            +
              +
            • CPU - at least 2 physical cores/ 4vCPUs

            • +
            • Memory - 15GB+ DRAM

            • +
            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

            • +
            • Network - 1GbE/10GbE preferred

            • +
            +
            +

            Calculating Prometheus Minimal Disk Space requirement

            +

            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

            +

            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

            +

            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

            +
            6 * 16 * 200MB ~ 20GB
            +
            +
            +

            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

            +

            The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. The current monitoring solution does not churn data.

            +
            +
            +
            +

            Install Scylla Monitoring Stack

            +

            The following procedure uses a CentOS 7 based instance

            +
              +
            1. Download the latest Scylla Monitoring Stack release.

            2. +
            +

            wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz

            +
              +
            1. Open the tar

            2. +
            +

            tar -xvf scylla-monitoring-3.5.tar.gz

            +
            +
            +

            Install Alertmanager

            +

            Tested with alertmanager 0.20.0 version

            +
              +
            1. Install alertmanager

            2. +
            +
            wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz
            +tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz
            +
            +
            +
              +
            1. Copy the following file: rule_config.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to alertmanager.yml in the alertmanager installation directory.

            2. +
            +

            For example:

            +
            cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml
            +
            +
            +
              +
            1. Start the Alertmanager

            2. +
            +

            For example:

            +
            cd alertmanager-0.20.0.linux-amd64
            +./alertmanager
            +
            +
            +
              +
            1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

            2. +
            +

            For example:

            +
            http://192.168.135.166:9093/
            +
            +
            +_images/alertmanager.png +
            +
            +

            Install Prometheus

            +

            Tested with Prometheus version 2.18.1

            +
              +
            1. Install Prometheus

            2. +
            +
            wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz
            +tar -xvf prometheus-2.18.1.linux-amd64.tar.gz
            +
            +
            +
              +
            1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to Prometheus installation directory.

            2. +
            +

            Copy prometheus/prometheus.yml.template to prometheus.yml

            +

            For example:

            +
            cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64
            +cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml
            +
            +
            +
              +
            1. Edit the prometheus.yml file to point to the correct static data sources.

            2. +
            +
            +

            Note

            +

            Make sure to include the honor_labels: false parameter in the prometheus.yml file.

            +
            +
            vi prometheus-2.18.1.linux-amd64/prometheus.yml
            +
            +
            +

            Set the alertmanger address and port by replacing AM_ADDRESS in the file.

            +

            For example if the alertmanager will run on the same host:

            +
            alerting:
            +   alertmanagers:
            +   - static_configs:
            +       - targets:
            +           - 127.0.0.1:9093
            +
            +
            +

            Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

            +

            For example the scrape config for Scylla:

            +
            global:
            +  scrape_interval: 5s # By default, scrape targets every 5 second.
            +  scrape_timeout: 4s # Timeout before trying to scape a target again
            +
            +  # Attach these labels to any time series or alerts when communicating with
            +  # external systems (federation, remote storage, Alertmanager).
            +  external_labels:
            +    monitor: 'scylla-monitor'
            +
            +scrape_configs:
            +- job_name: scylla
            +  honor_labels: false
            +  file_sd_configs:
            +    - files:
            +      - scylla_servers.yml
            +  relabel_configs:
            +    - source_labels: [__address__]
            +      regex:  '([^:]+)'
            +      target_label: __address__
            +      replacement: '${1}:9180'
            +
            +    - source_labels: [__address__]
            +      regex:  '(.*):.+'
            +      target_label: instance
            +      replacement: '${1}'
            +
            +
            +
              +
            1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

            2. +
            +
            +

            Note

            +

            There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

            +
            +

            An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

            +
            +

            Note

            +

            You must have both files even if you are not using Scylla Manager

            +
            +

            Add the labels for the cluster and data-center

            +

            scylla_servers.yml:

            +

            For example:

            +
            cat scylla_servers.yml
            +# List Scylla end points
            +
            +- targets:
            +  - 192.168.66.6
            +  - 192.168.66.244
            +  labels:
            +    cluster: cluster1
            +    dc: dc1
            +- targets:
            +    - 172.17.0.3
            +  labels:
            +    cluster: cluster1
            +    dc: dc2
            +
            +
            +
            +

            Note

            +

            See the previous note about deprecating the node_exporter_servers.yml file.

            +
            +

            scylla_manager_server.yml

            +

            For example:

            +
            - targets:
            +  - 127.0.0.1:56090
            +
            +
            +
              +
            1. Create a data directory for Prometheus to store the metrics data

            2. +
            +

            For example:

            +
            mkdir prometheus-2.18.1.linux-amd64/mydata
            +
            +
            +
              +
            1. Start Prometheus server:

            2. +
            +

            For example:

            +
            cd prometheus-2.18.1.linux-amd64
            +./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata
            +
            +
            +

            Data should start accumulate on: ./mydata

            +
              +
            1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

            2. +
            +

            For example:

            +
            http://192.168.135.166:9090/
            +
            +
            +_images/1.png +

            Prometheus console should be visible

            +
              +
            1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

            2. +
            +

            For example:

            +

            node_memory_MemFree

            +_images/2.png +

            And

            +

            scylla_reactor_utilization

            +_images/3.png +

            At this point Scylla is emitting the metrics and Prometheus is able to store them.

            +
            +
            +

            Install Grafana

            +

            Tested with Grafna 6.7.3

            +
              +
            1. Install Grafana based on the instructions here make sure to use version 6.7.0 or higher

            2. +
            +

            Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

            +
              +
            1. Access Scylla-Grafana-monitoring directory

            2. +
            +

            cd scylla-monitoring-scylla-monitoring-3.5/

            +
              +
            1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

            2. +
            +
            sudo cp -r grafana/plugins /var/lib/grafana/
            +
            +
            +

            If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

            +

            For example:

            +
            cp -r grafana/plugins ../grafana-6.7.3/public/app
            +
            +
            +
              +
            1. Provision the Dashboard them

            2. +
            +

            For example Scylla version 4.0 and Scylla manager version 2.0

            +

            For Grafana installed with yum install

            +
            sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
            +sudo mkdir -p /var/lib/grafana/dashboards
            +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
            +
            +
            +

            For Grafana installed from packages

            +
            cp -p -r grafana/build/* ../grafana-6.7.3/public/build/
            +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml
            +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml
            +
            +
            +

            Edit the load.* files in /home/centos/grafana-6.7.3/conf/provisioning/dashboards/ for the correct path, +for example load.4.0.yaml would point to: /home/centos/grafana-6.7.3/public/build/ver_4.0 and the FOLDER will be 4.0

            +
              +
            1. Set the data source by copy datasource.yml and edit it

            2. +
            +
            sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
            +
            +
            +

            For Grafana installed from packages

            +
            cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/
            +
            +
            +

            You should set the Prometheus and the alertmanager IP and port.

            +

            For example

            +
            sudo cat /etc/grafana/provisioning/datasources/datasource.yml
            +apiVersion: 1
            +datasources:
            + - name: prometheus
            +   type: prometheus
            +   url: http://192.168.135.167:9090
            +   access: proxy
            +   basicAuth: false
            +
            + - name: alertmanager
            +   type: camptocamp-prometheus-alertmanager-datasource
            +   orgId: 1
            +   typeLogoUrl: public/img/icn-datasource.svg
            +   access: proxy
            +   url: http://192.168.135.166:9093
            +   password:
            +   user:
            +   database:
            +   basicAuth:
            +   isDefault:
            +   jsonData:
            +     severity_critical: '4'
            +     severity_high: '3'
            +     severity_warning: '2'
            +     severity_info: '1'
            +
            +
            +
              +
            1. Start the Grafana service

            2. +
            +

            For Grafana installed with yum install

            +

            sudo service grafana-server start

            +

            For Grafana installed from packages:

            +

            cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini

            +

            Edit scylla.ini to reflect the right paths in the paths section of the file.

            +
            plugins = /home/centos/grafana-6.7.3/data/plugins
            +provisioning = /home/centos/grafana-6.7.3/conf/provisioning
            +
            +
            +

            Start the server:

            +
            cd /home/centos/grafana-6.7.3/
            +./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini
            +
            +
            +
              +
            1. Make sure Grafana is running

            2. +
            +

            Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

            +_images/grafana.png +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/monitoring_apis.html b/branch-3.6/monitoring_apis.html new file mode 100644 index 000000000..7ed48eff6 --- /dev/null +++ b/branch-3.6/monitoring_apis.html @@ -0,0 +1,650 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Scylla Monitoring Stack Interfaces

            +

            Scylla exposes two interfaces for online monitoring, as described below

            +
            +

            Prometheus

            +

            By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

            +

            For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack

            +

            You can change the Prometheus listening address and port in scylla.yaml file

            +
            # prometheus port
            +# By default, Scylla opens prometheus API port on port 9180
            +# setting the port to 0 will disable the prometheus API.
            +prometheus_port: 9180
            +#
            +# prometheus address
            +# By default, Scylla binds all interfaces to the prometheus API
            +# It is possible to restrict the listening address to a specific one
            +prometheus_address: 0.0.0.0
            +
            +
            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/monitoring_stack.html b/branch-3.6/monitoring_stack.html new file mode 100644 index 000000000..b1f41ca27 --- /dev/null +++ b/branch-3.6/monitoring_stack.html @@ -0,0 +1,957 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Install Scylla Monitoring Stack

            + +

            This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API.

            +

            The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

            +

            For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

            +
            +

            Minimal Production System Recommendations

            +
              +
            • CPU - at least 2 physical cores/ 4vCPUs

            • +
            • Memory - 15GB+ DRAM

            • +
            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

            • +
            • Network - 1GbE/10GbE preferred

            • +
            +
            +

            Calculating Prometheus Minimal Disk Space requirement

            +

            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

            +

            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

            +

            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

            +
            6 * 16 * 200MB ~ 20GB
            +
            +
            +

            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

            +
            +
            +
            +

            Prerequisites

            + +
            +
            +

            Docker Post Installation

            +

            Docker post installation guide can be found here

            +
            +

            Note

            +

            Avoid running the container as root.

            +
            +

            To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

            +
              +
            1. Create the Docker group.

            2. +
            +
            sudo groupadd docker
            +
            +
            +
              +
            1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

            2. +
            +
            sudo usermod -aG docker $USER
            +
            +
            +
              +
            1. Start Docker by calling:

            2. +
            +
            sudo systemctl enable docker
            +
            +
            +
            +
            +

            Install Scylla Monitoring Stack

            +

            Procedure

            +
              +
            1. Download and extract the latest Scylla Monitoring Stack binary;.

            2. +
            +
            wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.6.3.tar.gz
            +tar -xvf scylla-monitoring-3.6.3.tar.gz
            +cd scylla-monitoring-scylla-monitoring-3.6.3
            +
            +
            +

            As an alternative, you can clone and use the Git repository directly.

            +
            git clone https://github.com/scylladb/scylla-monitoring.git
            +cd scylla-monitoring
            +git checkout branch-3.6
            +
            +
            +
              +
            1. Start Docker service if needed

            2. +
            +
            sudo systemctl restart docker
            +
            +
            +
            +
            +

            Configure Scylla Monitoring Stack

            +

            To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

            +

            This configuration can be done from files, or using the Consul api.

            +

            Scylla Manager 2.0 and higher supports the Consul API.

            +
            +

            Configure Scylla nodes from files

            +
              +
            1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

            2. +
            +
            +

            Note

            +

            It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

            +
            +

            For example:

            +
            - targets:
            +      - 172.17.0.2
            +      - 172.17.0.3
            +  labels:
            +      cluster: cluster1
            +      dc: dc1
            +
            +
            +
            +

            Note

            +

            If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

            +
            +

            Using IPV6

            +

            To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

            +

            For example:

            +
            - targets:
            +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
            +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
            +  labels:
            +      cluster: cluster1
            +      dc: dc1
            +
            +
            +
            +

            Note

            +

            For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

            +
            +

            For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

            +
            +

            Note

            +

            By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

            +
            +

            If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

            +

            For example:

            +
            ./start-all.sh -s my_scylla_server.yml -d prometheus_data
            +
            +
            +

            Mark the different Data Centers with Labels.

            +

            As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

            +

            You can use the genconfig.py script to generate the server file. For example:

            +
            ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
            +
            +
            +

            This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

            +

            OR

            +

            The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

            +
            nodetool status | ./genconfig.py -NS
            +
            +
            +

            2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

            +

            You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

            +

            For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

            +
            # List Scylla Manager end points
            +
            +- targets:
            +  - 172.17.0.7:5090
            +
            +
            +

            Note that you do not need to add labels to the Scylla Manager targets.

            +
            +
            +

            Configure Scylla nodes using Scylla-Manager Consul API

            +

            Scylla Manager 2.0 has a Consul like API.

            +

            When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

            +

            For example:

            +
            ./start-all.sh -L 10.10.0.1
            +
            +
            +
            +

            Note

            +

            If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

            +
            +
            +
            +

            Connecting Scylla-Monitoring to Scylla

            +

            Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

            +

            You can limit the user to read only, currently it only read table from the system keyspace.

            +

            To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

            +

            Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

            +
            +
            +

            Use an external directory for the Prometheus data directory

            +

            The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

            +
            +

            Note

            +

            Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

            +
            +

            If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

            +

            In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

            +
            +
            +

            Add Additional Prometheus Targets

            +

            There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

            +

            The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

            +

            You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

            +
            - job_name: 'myservice'
            +  # Override the global default and scrape targets from this job every 5 seconds.
            +  scrape_interval: 5s
            +  static_configs:
            +    - targets:
            +      - 17.0.0.1:7000
            +
            +
            +
            +
            +
            +

            Start and Stop Scylla Monitoring Stack

            +
            +

            Start

            +
            ./start-all.sh -d prometheus_data
            +
            +
            +
            +
            +

            Stop

            +
            ./kill-all.sh
            +
            +
            +
            +
            +

            Start a Specific Scylla Monitoring Stack Version

            +

            By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

            +

            You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

            +

            Multiple versions are supported. For example:

            +
            ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
            +
            +
            +

            will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

            +
            +
            +

            Accessing the localhost

            +

            The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

            +
            ./start-all.sh -l -d prometheus-data
            +
            +
            +
            +
            +

            Configure rsyslog on each Scylla node

            +

            generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

            +

            Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

            +

            Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

            +

            If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

            +
            if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
            +
            +
            +

            Restart rsyslog for the configuration to take effect.

            +
            systemctl restart rsyslog
            +
            +
            +
            +
            +
            +

            View Grafana Dashboards

            +

            Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/objects.inv b/branch-3.6/objects.inv new file mode 100644 index 000000000..355524c7b Binary files /dev/null and b/branch-3.6/objects.inv differ diff --git a/branch-3.6/robots.txt b/branch-3.6/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.6/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.6/search.html b/branch-3.6/search.html new file mode 100644 index 000000000..7825927bc --- /dev/null +++ b/branch-3.6/search.html @@ -0,0 +1,607 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + + + + + +
            + + + + + +
            + + +
            + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/searchindex.js b/branch-3.6/searchindex.js new file mode 100644 index 000000000..963978f02 --- /dev/null +++ b/branch-3.6/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "advisor", "alerting", "cql_optimization", "docker_compose", "index", "matrix", "min-prod-hw", "monitor_troubleshoot", "monitor_without_docker", "monitoring_apis", "monitoring_stack", "start_all", "thanos", "updating_dashboard"], "filenames": ["_common/monitor-description.rst", "advisor.rst", "alerting.rst", "cql_optimization.rst", "docker_compose.rst", "index.rst", "matrix.rst", "min-prod-hw.rst", "monitor_troubleshoot.rst", "monitor_without_docker.rst", "monitoring_apis.rst", "monitoring_stack.rst", "start_all.rst", "thanos.rst", "updating_dashboard.rst"], "titles": ["<no title>", "Scylla Monitoring Stack Advisor", "Alerting", "The CQL Optimization", "Using Docker Compose", "Scylla Monitoring Stack", "Scylla Monitoring Stack Support Matrix", "Minimal Production System Recommendations", "Troubleshoot Scylla Monitoring Stack", "Deploying Scylla Monitoring Stack Without Docker", "Scylla Monitoring Stack Interfaces", "Install Scylla Monitoring Stack", "The start-all.sh command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Adding and Modifying Dashboards"], "terms": {"3": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14], "6": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "scylla": [0, 2, 3, 4, 7, 12, 14], "monitor": [0, 2, 3, 4, 7, 12, 14], "stack": [0, 3, 4, 12, 14], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "full": [0, 2, 5, 11], "alert": [0, 5, 9, 11], "The": [0, 2, 4, 5, 6, 7, 8, 9, 11, 13], "contain": [0, 3, 4, 5, 11, 12, 13, 14], "open": [0, 5, 6, 9, 10, 11], "sourc": [0, 2, 5, 6, 9, 11], "tool": [0, 3, 5, 8], "includ": [0, 5, 9], "prometheu": [0, 3, 5, 6, 8, 14], "grafana": [0, 2, 5, 13], "well": [0, 5, 11], "custom": [0, 5], "dashboard": [0, 1, 2, 3, 5, 6, 8, 9, 12], "an": [1, 3, 4, 7, 8, 9, 12, 13, 14], "element": [1, 14], "recogn": 1, "bad": 1, "practic": 1, "configur": [1, 2, 4, 8, 9, 10, 12, 14], "potenti": [1, 3], "problem": [1, 2, 3], "advis": [1, 4], "how": [1, 2, 3, 12, 13, 14], "solv": 1, "them": [1, 2, 9, 12, 14], "locat": [1, 2, 4, 12], "overview": [1, 2], "consist": [1, 2, 5], "two": [1, 3, 4, 10, 11, 12, 13], "part": [1, 2, 3, 11], "On": [1, 8], "left": 1, "issu": [1, 3, 14], "tabl": [1, 2, 3, 6, 11], "each": [1, 2, 3, 6, 7, 8, 9, 12, 13, 14], "ha": [1, 2, 3, 7, 8, 9, 11, 12, 14], "categori": [1, 3], "link": [1, 14], "jump": 1, "relev": [1, 12], "descript": [1, 2], "For": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 14], "exampl": [1, 2, 3, 4, 7, 8, 9, 11, 12, 13], "could": [1, 3, 13], "warn": 1, "about": [1, 2, 9, 14], "us": [1, 2, 3, 5, 7, 8, 9, 12], "larg": [1, 14], "cell": 1, "data": [1, 2, 3, 9, 12, 14], "usual": [1, 3, 8, 14], "indic": [1, 3], "model": [1, 3], "client": [1, 3], "code": 1, "can": [1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14], "impact": 1, "system": [1, 2, 3, 4, 12], "perform": [1, 3, 7, 9, 11], "right": [1, 3, 9, 11, 14], "balanc": [1, 3], "thi": [1, 2, 3, 4, 7, 8, 9, 11, 12, 13, 14], "notifi": [1, 2], "you": [1, 2, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14], "imbal": 1, "between": [1, 3, 8, 13], "shard": 1, "node": [1, 3, 6, 7, 8, 9, 12], "imbalanc": 1, "mai": [1, 3, 8], "when": [1, 3, 4, 7, 8, 9, 11, 12, 13, 14], "singl": [1, 13, 14], "hot": 1, "partit": 1, "get": [1, 2, 3, 5, 11, 13, 14], "most": [1, 2, 3, 9, 14], "request": [1, 10, 12], "make": [1, 2, 3, 4, 8, 9, 11, 12, 13, 14], "one": [1, 3, 4, 10, 11, 12], "bottleneck": 1, "latenc": [1, 3], "cach": 1, "hit": 1, "ar": [1, 2, 3, 4, 8, 9, 11, 12, 13, 14], "enhanc": 2, "someth": [2, 12, 14], "wrong": [2, 3, 8, 14], "read": [2, 4, 8, 11, 13], "more": [2, 3, 4, 8, 10, 11, 14], "here": [2, 5, 9, 11, 12, 14], "By": [2, 3, 9, 10, 11, 12, 14], "default": [2, 3, 7, 8, 9, 10, 11, 12, 14], "shown": [2, 8], "also": [2, 11, 12, 13, 14], "sent": 2, "other": [2, 4, 13], "extern": [2, 3, 4, 8, 9, 12, 13, 14], "like": [2, 3, 7, 8, 9, 11, 13, 14], "email": 2, "slack": 2, "In": [2, 3, 4, 8, 11, 14], "gener": [2, 3, 4, 11], "specif": [2, 3, 8, 10, 12], "condit": 2, "met": 2, "within": [2, 11], "certain": 2, "period": [2, 7, 9, 11, 13], "time": [2, 3, 7, 9, 11, 12, 13], "thei": [2, 12], "send": [2, 3, 11], "act": [2, 11, 13], "so": [2, 3, 8, 11, 12, 13, 14], "activ": [2, 11], "defin": [2, 3, 14], "rule": [2, 4, 9, 12], "yml": [2, 3, 4, 8, 9, 11, 12, 13], "file": [2, 9, 10, 12, 13, 14], "directori": [2, 4, 9, 12, 13, 14], "name": [2, 3, 8, 9, 11, 13], "what": 2, "happen": [2, 8], "long": [2, 13], "report": [2, 3, 6, 8], "let": 2, "u": 2, "look": [2, 3, 11, 13, 14], "instancedown": 2, "come": [2, 12], "expr": [2, 14], "up": [2, 3, 4, 8, 9], "0": [2, 4, 6, 9, 10, 11, 12, 13, 14], "60": 2, "label": [2, 9, 11, 13], "sever": 2, "2": [2, 4, 6, 7, 9, 11, 12, 14], "annot": 2, "instanc": [2, 9, 11, 14], "been": 2, "down": [2, 4, 8], "than": [2, 3, 11, 14], "30": [2, 12], "second": [2, 8, 9, 11], "summari": 2, "legal": 2, "express": 2, "case": [2, 3, 7, 8, 9, 11, 12, 13, 14], "metric": [2, 3, 5, 6, 7, 9, 11, 12, 13, 14], "equal": 2, "set": [2, 9, 10, 11, 12, 14], "minim": 2, "durat": 2, "befor": [2, 3, 9, 11], "prior": 2, "pend": 2, "mode": [2, 14], "hold": [2, 3, 7, 9, 11], "addit": [2, 3, 12], "special": 2, "add": [2, 3, 9, 10, 12, 13, 14], "notif": 2, "forward": 2, "from": [2, 3, 4, 8, 9, 12, 13], "server": [2, 3, 4, 5, 9, 10, 11, 12, 13, 14], "respons": 2, "duplic": [2, 3], "group": [2, 11], "rout": [2, 3], "found": [2, 9, 11, 12, 14], "rule_config": [2, 4, 9, 12], "three": [2, 5, 11], "repres": 2, "tree": 2, "win": [2, 8], "inhibit": 2, "mute": 2, "base": [2, 3, 4, 9, 11, 12, 13, 14], "anoth": [2, 12], "receiv": [2, 3], "via": [2, 8], "sluck": 2, "etc": [2, 4, 9, 11, 12, 14], "check": [2, 3, 8], "document": [2, 8, 11, 13, 14], "detail": 2, "specifi": [2, 4, 8, 11, 12, 14], "It": [2, 4, 10, 11, 12, 14], "": [2, 3, 11, 12, 14], "wors": 2, "have": [2, 4, 7, 8, 9, 11, 12, 13, 14], "doe": [2, 3, 7, 8, 9, 11, 12, 13, 14], "work": [2, 11, 12, 13, 14], "all": [2, 3, 4, 5, 8, 10, 11, 13, 14], "There": [2, 9, 11, 13, 14], "multipl": [2, 3, 11, 12, 13, 14], "wai": [2, 3, 4, 8, 12], "sure": [2, 3, 4, 8, 9, 11, 13, 14], "your": [2, 3, 4, 8, 9, 10, 11, 12, 13, 14], "correctli": [2, 14], "start": [2, 5, 9, 13, 14], "path": [2, 4, 9, 11, 12, 13], "mail": 2, "simpl": 2, "negat": 2, "logic": 2, "forc": 2, "reduc": [2, 14], "limit": [2, 3, 11, 13], "possibl": [2, 3, 10, 12], "simul": 2, "actual": 2, "scenario": 2, "see": [2, 3, 4, 5, 7, 8, 9, 10, 11, 14], "expect": 2, "low": [2, 3], "avail": [2, 3, 9, 11, 13, 14], "disk": [2, 8, 12, 14], "space": 2, "assum": [2, 7, 9, 11, 12, 13], "want": [2, 11], "lower": [2, 3], "10": [2, 11, 14], "fire": 2, "That": [2, 12, 14], "would": [2, 3, 9, 11, 13, 14], "show": [2, 3, 6, 14], "propag": 2, "ani": [2, 3, 8, 9, 11, 14], "valu": [2, 3, 14], "similar": [2, 14], "current": [2, 8, 9, 11, 12, 14], "situat": [2, 3, 11, 12], "now": [2, 13], "free": 2, "below": [2, 4, 10, 11], "creat": [2, 3, 4, 8, 9, 11, 12, 14], "some": [2, 13], "big": [2, 3], "help": [2, 3, 9, 12, 14], "bisect": 2, "identifi": 3, "driver": 3, "upper": 3, "relat": 3, "gaug": 3, "graph": [3, 14], "inspect": 3, "we": [3, 7, 9, 11, 13, 14], "zero": 3, "besid": [3, 12], "intern": [3, 14], "which": [3, 4, 6, 13, 14], "mislead": 3, "test": [3, 8, 9], "traffic": [3, 8, 13], "follow": [3, 4, 6, 7, 8, 9, 11, 12, 14], "section": [3, 7, 8, 9, 11], "describ": [3, 8, 10, 11, 13], "panel": 3, "first": 3, "templat": [3, 8, 9, 11, 13], "place": [3, 11, 12, 13, 14], "holder": 3, "differ": [3, 4, 9, 11, 12, 13, 14], "benefit": [3, 13], "databas": [3, 4, 9, 12], "onli": [3, 11, 12], "need": [3, 7, 8, 9, 11, 12, 13, 14], "pars": [3, 14], "onc": [3, 4], "safer": 3, "prevent": 3, "inject": 3, "non": [3, 8], "percentag": [3, 14], "rate": 3, "both": [3, 4, 8, 9, 11], "distribut": 3, "where": [3, 4, 8, 9, 11, 14], "rang": [3, 8], "ring": 3, "ideal": 3, "reach": [3, 11, 13], "replica": [3, 13], "fail": 3, "do": [3, 8, 11, 12, 14], "mean": [3, 12, 14], "coordin": 3, "result": [3, 11, 12], "higher": [3, 9, 11], "increas": 3, "resourc": 3, "usag": [3, 8], "typic": [3, 9, 14], "know": [3, 8, 11], "replic": 3, "load": [3, 8, 9, 11], "caus": 3, "did": 3, "break": [3, 14], "chunk": 3, "repli": 3, "size": [3, 14], "requir": [3, 4, 13], "return": [3, 8], "overal": 3, "should": [3, 4, 8, 9, 11, 13, 14], "avoid": [3, 8, 11, 14], "support": [3, 5, 11, 14], "compound": 3, "primari": 3, "kei": 3, "cluster": [3, 7, 9, 11], "column": 3, "kind": 3, "effici": 3, "sort": [3, 14], "order": 3, "BY": 3, "wa": [3, 14], "ineffici": 3, "ks1": 3, "table_demo": 3, "text": 3, "type": [3, 9, 14], "int": 3, "WITH": 3, "desc": 3, "select": 3, "cat1": 3, "asc": 3, "side": 3, "user": [3, 4, 9, 11, 12], "overhead": 3, "These": 3, "care": 3, "thing": 3, "mani": 3, "exist": [3, 11, 14], "much": 3, "drop": 3, "row": [3, 14], "were": 3, "match": [3, 11], "reason": [3, 8, 13, 14], "A": [3, 12, 13, 14], "determin": 3, "common": [3, 12], "quorum": 3, "major": 3, "success": 3, "hurt": 3, "persist": [3, 4, 7, 9, 11, 12], "lost": [3, 11, 12, 14], "cl": 3, "unavail": 3, "oper": 3, "expens": 3, "term": 3, "cost": 3, "ONE": 3, "end": [3, 9, 11], "local": [3, 8, 9, 11, 12, 13, 14], "local_quorum": 3, "local_on": 3, "instead": [3, 9, 11, 13], "reli": 3, "definit": [3, 14], "per": [3, 7, 9, 11, 13], "center": [3, 9, 11, 13], "scylla_serv": [3, 4, 8, 9, 11], "If": [3, 8, 9, 11, 12, 13, 14], "nearest": 3, "sh": [4, 5, 8, 11], "kill": [4, 8, 11], "script": [4, 5, 11, 12, 14], "altern": [4, 11], "method": [4, 11], "manual": [4, 8], "step": [4, 8, 9, 13, 14], "simplifi": 4, "start_al": 4, "launch": 4, "particular": 4, "updat": [4, 8, 9, 14], "ignor": [4, 12], "instal": [4, 5, 8], "among": 4, "ip": [4, 8, 9, 10, 11, 12, 13], "address": [4, 8, 9, 10, 11, 12, 13], "alertmanag": [4, 5, 12], "either": [4, 11], "consul": [4, 12], "manag": [4, 5, 6, 9], "config": [4, 9, 12], "product": [4, 12], "accordingli": 4, "its": [4, 11, 12, 13, 14], "note": [4, 8, 9, 11, 12], "latter": 4, "tell": 4, "themselv": [4, 14], "run": [4, 5, 6, 8, 9, 11, 12, 13, 14], "command": [4, 8, 11, 13], "datasourc": [4, 9, 11, 13, 14], "under": [4, 9, 11], "yaml": [4, 9, 10, 11], "To": [4, 7, 9, 10, 11, 14], "sashboard": 4, "t": [4, 14], "line": [4, 11, 12, 13, 14], "flag": [4, 8, 11, 12, 13, 14], "v": [4, 8, 11, 12, 13, 14], "version": [4, 5, 6, 8, 9, 12, 14], "enterpris": [4, 6, 11, 14], "2020": [4, 6, 11, 14], "1": [4, 6, 9, 11, 12, 13, 14], "pass": [4, 11, 12], "call": [4, 11, 12], "servic": [4, 8, 9, 11, 12], "container_nam": 4, "aalert": 4, "imag": [4, 8], "prom": [4, 8, 13], "v0": [4, 9], "21": 4, "port": [4, 8, 9, 10, 11, 12], "9093": [4, 9], "volum": [4, 7, 9, 11], "agraf": 4, "environ": [4, 12], "gf_panels_disable_sanitize_html": 4, "true": [4, 14], "gf_paths_provis": 4, "var": [4, 9], "lib": [4, 9], "gf_plugins_allow_loading_unsigned_plugin": 4, "scylladb": [4, 9, 11], "secur": 4, "gf_auth_basic_en": 4, "fals": [4, 9, 14], "gf_auth_anonymous_en": 4, "gf_auth_anonymous_org_rol": 4, "admin": [4, 11, 12], "gf_security_admin_password": 4, "7": [4, 9, 11, 14], "5": [4, 6, 7, 8, 9, 11, 14], "3000": [4, 9, 11], "1000": 4, "build": [4, 9], "plugin": [4, 9], "uncom": [4, 11], "dir": [4, 12, 13], "loki": [4, 11], "mnt": 4, "3100": 4, "conf": [4, 9, 11], "promotheu": 4, "aprom": [4, 8], "v2": [4, 9], "18": [4, 9], "9090": [4, 8, 9, 13], "d": [4, 11, 12, 13], "scylla_manager_serv": [4, 8, 9, 11], "node_exporter_serv": [4, 9, 11], "promtail": 4, "1514": [4, 11], "9080": 4, "promtail_config": 4, "older": 5, "compon": 5, "wrap": 5, "docker": [5, 8, 12, 13], "collect": [5, 11, 12, 13], "store": [5, 9, 13, 14], "handl": [5, 11, 12], "choos": [5, 8], "topic": 5, "compos": 5, "interfac": [5, 8], "deploi": [5, 11], "without": [5, 11, 12, 14], "troubleshoot": 5, "guid": [5, 8, 11], "integr": 5, "upgrad": 5, "advisor": 5, "ad": [5, 7, 9, 11, 12], "modifi": 5, "thano": 5, "matrix": 5, "lesson": 5, "univers": 5, "node_export": [6, 8, 9, 11, 12], "4": [6, 9, 11, 14], "2019": [6, 11], "17": [6, 8, 9, 11], "2018": 6, "14": [6, 8], "agent": [6, 8, 11, 12, 13], "o": [6, 12], "cpu": [7, 9, 11], "least": [7, 9, 11], "physic": [7, 9, 11], "core": [7, 9, 11], "4vcpu": [7, 9, 11], "memori": [7, 9, 11], "15gb": [7, 9, 11], "dram": [7, 9, 11], "storag": [7, 9, 11, 12, 14], "proport": [7, 9, 11], "number": [7, 9, 11, 13], "retent": [7, 9, 11], "network": [7, 8, 9, 11, 12], "1gbe": [7, 9, 11], "10gbe": [7, 9, 11], "prefer": [7, 8, 9, 11], "block": [7, 9, 11], "ec2": [7, 9, 11], "eb": [7, 9, 11], "15": [7, 9, 11], "dai": [7, 9, 11, 12], "around": [7, 8, 9, 11], "200mb": [7, 9, 11], "scrape": [7, 9, 11], "interv": [7, 9, 11], "16": [7, 8, 9, 11], "20gb": [7, 9, 11], "account": [7, 9, 11], "unexpect": [7, 9, 11], "event": [7, 9, 11], "replac": [7, 9, 11, 13, 14], "alloc": [7, 9, 11], "x4": [7, 9, 11], "100gb": [7, 9, 11], "fast": [7, 9, 11], "enough": [7, 9, 11], "provid": [7, 9, 11, 13], "out": [7, 9, 11, 13], "box": [7, 9, 11, 13], "done": [8, 11, 12, 14], "chang": [8, 10, 12, 14], "56090": [8, 9], "5090": [8, 11], "backward": [8, 14], "compat": [8, 14], "old": 8, "new": [8, 11], "howev": 8, "twice": 8, "easiest": 8, "edit": [8, 9, 11, 12, 13, 14], "remov": 8, "scylla_manager1": 8, "job": [8, 11], "take": [8, 11, 12, 14], "effect": [8, 11, 14], "messag": 8, "wait": 8, "log": [8, 11, 13], "failur": [8, 12], "root": [8, 11], "post": 8, "becaus": [8, 12], "own": [8, 11, 12], "proper": 8, "past": 8, "ownership": 8, "cento": [8, 9], "l": [8, 11, 12], "la": 8, "grep": 8, "drwxr": 8, "xr": 8, "x": [8, 14], "4096": 8, "jun": 8, "25": 8, "51": 8, "sudo": [8, 9, 11], "chown": 8, "r": [8, 9, 12, 14], "appear": 8, "unreach": 8, "immedi": 8, "suspect": 8, "connect": [8, 10, 13, 14], "login": [8, 11], "consol": [8, 9], "browser": [8, 9, 11, 13, 14], "http": [8, 9, 11, 13], "go": [8, 11], "target": [8, 9, 10, 12, 14], "tab": 8, "127": [8, 9, 12], "insid": [8, 9, 11, 12, 14], "host": [8, 9, 11, 12], "try": [8, 9], "enabl": [8, 11, 13], "confirm": 8, "pull": [8, 11], "align": 8, "option": [8, 11, 13], "procedur": [8, 9, 11], "p": [8, 9, 12, 13], "id": [8, 14], "statu": [8, 11], "41bd3db26240": 8, "entrypoin": 8, "ago": 8, "23": 8, "7000": [8, 11], "7001": 8, "tcp": 8, "9042": 8, "9160": 8, "9180": [8, 9, 10, 11], "10000": 8, "gui": [8, 12, 14], "click": 8, "fetch": 8, "curl": 8, "scylla_nod": 8, "binari": [8, 11], "firewal": [8, 11], "172": [8, 9, 11], "machin": [8, 11, 12], "ef": 8, "gre": 8, "scylla_setup": 8, "9100": 8, "pleas": [8, 9], "while": 8, "captur": 8, "tshark": 8, "f": 8, "dst": 8, "eth0": 8, "toward": 8, "199": 8, "203": 8, "229": 8, "89": 8, "12": [8, 14], "142": 8, "66": [8, 9], "59212": 8, "ack": 8, "seq": 8, "317": 8, "78193": 8, "158080": 8, "len": 8, "tsval": 8, "79869679": 8, "tsecr": 8, "3347447210": 8, "74": 8, "60440": 8, "syn": 8, "29200": 8, "mss": 8, "1460": 8, "sack_perm": 8, "79988291": 8, "w": [8, 14], "128": 8, "instruct": [9, 11], "main": 9, "item": 9, "indefinit": 9, "accru": 9, "solut": [9, 13], "churn": 9, "download": [9, 11], "latest": [9, 11, 12], "releas": 9, "wget": [9, 11], "github": [9, 11], "com": [9, 11], "archiv": [9, 11], "tar": [9, 11], "gz": [9, 11], "xvf": [9, 11], "20": 9, "linux": 9, "amd64": 9, "copi": 9, "cp": 9, "home": 9, "cd": [9, 11], "verifi": 9, "point": [9, 11, 14], "192": [9, 11], "168": [9, 11], "135": 9, "166": 9, "correct": 9, "static": 9, "honor_label": 9, "paramet": [9, 12], "vi": 9, "alertmang": 9, "am_address": 9, "same": [9, 11], "static_config": [9, 11], "manager_ag": 9, "global": [9, 11], "scrape_interv": [9, 11], "everi": [9, 11, 12], "scrape_timeout": 9, "timeout": 9, "scape": 9, "again": [9, 11], "attach": 9, "seri": [9, 13], "commun": 9, "feder": 9, "remot": 9, "external_label": 9, "scrape_config": 9, "job_nam": [9, 11], "file_sd_config": 9, "relabel_config": 9, "source_label": 9, "__address__": 9, "regex": 9, "target_label": 9, "those": 9, "must": [9, 11], "even": [9, 11, 12], "cat": 9, "list": [9, 11], "244": 9, "cluster1": [9, 11], "dc": [9, 11, 13], "dc1": [9, 11], "dc2": [9, 11], "previou": 9, "deprec": 9, "mkdir": 9, "mydata": 9, "tsdb": [9, 12, 13], "accumul": 9, "visibl": 9, "execut": 9, "queri": 9, "through": 9, "node_memory_memfre": 9, "And": 9, "scylla_reactor_util": 9, "At": [9, 14], "emit": 9, "abl": [9, 13], "grafna": 9, "depend": [9, 13], "repositori": [9, 11], "yum": 9, "zip": 9, "structur": 9, "rest": [9, 13], "access": [9, 12], "packag": 9, "public": 9, "app": 9, "provis": [9, 11, 14], "manager_2": 9, "ver_4": 9, "folder": 9, "apivers": 9, "url": [9, 13], "167": 9, "proxi": 9, "basicauth": 9, "camptocamp": 9, "orgid": 9, "typelogourl": 9, "img": 9, "icn": 9, "svg": 9, "password": [9, 11, 12], "isdefault": 9, "jsondata": 9, "severity_crit": 9, "severity_high": 9, "severity_warn": 9, "severity_info": 9, "sampl": 9, "ini": 9, "reflect": 9, "bin": 9, "assumpt": 9, "colloc": 9, "expos": [10, 13], "onlin": 10, "listen": [10, 11, 12], "inform": [10, 11, 12, 14], "api": [10, 12, 13], "disabl": [10, 11], "prometheus_port": 10, "bind": [10, 12], "restrict": 10, "prometheus_address": 10, "setup": 11, "dedic": 11, "over": 11, "evalu": 11, "laptop": 11, "groupadd": 11, "next": [11, 12, 13], "usermod": 11, "ag": 11, "systemctl": 11, "extract": 11, "As": [11, 14], "clone": 11, "git": 11, "directli": 11, "checkout": 11, "branch": 11, "restart": [11, 12, 13], "wish": [11, 12], "import": [11, 12], "datacent": 11, "nodetool": 11, "valid": 11, "ipv6": 11, "squar": 11, "bracket": 11, "2600": 11, "1f18": 11, "26b1": 11, "3a00": 11, "fac8": 11, "118e": 11, "9199": 11, "67b9": 11, "67ba": 11, "web": [11, 13], "overrid": [11, 12, 14], "n": [11, 12], "my_scylla_serv": 11, "prometheus_data": 11, "mark": 11, "seen": 11, "genconfig": 11, "py": [11, 14], "myconf": 11, "four": 11, "OR": 11, "cql": 11, "protect": 11, "author": [11, 12], "assign": 11, "keyspac": 11, "securejsondata": 11, "outsid": [11, 12], "permiss": 11, "somewher": 11, "els": [11, 12], "myservic": 11, "m": [11, 12], "function": [11, 13], "featur": [11, 13], "direct": 11, "programnam": 11, "rsyslog_syslogprotocol23format": 11, "authent": [11, 12], "simplest": 12, "small": 12, "util": [12, 14], "appropri": 12, "h": [12, 14], "print": 12, "exit": 12, "applic": 12, "localhost": 12, "cannot": 12, "map": 12, "explicit": 12, "encapsul": 12, "param": 12, "allow": 12, "auto": 12, "automat": 12, "g": 12, "keep": 12, "clear": 12, "comma": 12, "separ": 12, "j": 12, "c": 12, "variabl": 12, "alter": 12, "q": 12, "anonym": 12, "role": 12, "privileg": 12, "behavior": 12, "editor": 12, "viewer": 12, "suppli": [12, 14], "b": 12, "resolv": 12, "explicitli": [12, 14], "week": 12, "opportun": 12, "demonstr": 12, "cover": 12, "30d": 12, "arbitrari": 12, "opensourc": 13, "top": 13, "additiuon": 13, "high": [13, 14], "horizont": 13, "scale": 13, "backup": 13, "flexibl": 13, "design": 13, "front": 13, "few": 13, "why": [13, 14], "total": [13, 14], "million": 13, "capac": 13, "sometim": 13, "reachabl": 13, "lifecycl": 13, "z": 13, "thanosio": 13, "grpc": 13, "10911": 13, "grace": 13, "10912": 13, "after": [13, 14], "togeth": 13, "ip1": 13, "ip2": 13, "debug": 13, "query0": 13, "level": 13, "10903": 13, "10904": 13, "abov": 13, "last": 13, "db_address": 13, "explain": 14, "whenev": 14, "gone": 14, "save": 14, "mention": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "suggest": 14, "maintain": 14, "json": 14, "too": 14, "verbos": 14, "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": 14, "fill": 14, "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "27": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "22": 14, "gridpo": 14, "y": 14, "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "nullpointmod": 14, "pointradiu": 14, "render": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": 14, "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "tooltip": 14, "msresolut": 14, "share": 14, "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "resembl": 14, "css": 14, "hierarch": 14, "inherit": 14, "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "150px": 14, "output": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "e": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": 14, "larger": 14, "longer": 14, "later": 14, "absolut": 14, "posit": 14, "ie": 14, "width": 14, "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": 14, "calcul": 14, "taken": 14, "still": 14, "unlik": 14, "partial": 14, "24": 14, "don": 14, "python": 14, "make_dashboard": 14, "revers": 14, "easier": 14, "wrapper": 14, "re": 14, "just": 14, "refresh": 14, "generate_gener": 14, "mayb": 14}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 5, 6, 8, 9, 10, 11, 13], "monitor": [1, 5, 6, 8, 9, 10, 11, 13], "stack": [1, 5, 6, 8, 9, 10, 11, 13], "advisor": 1, "The": [1, 3, 12, 14], "section": 1, "alert": [2, 12], "prometheu": [2, 4, 7, 9, 10, 11, 12, 13], "alertmanag": [2, 9], "tip": 2, "when": 2, "ad": [2, 14], "an": [2, 11], "cql": 3, "optim": 3, "prepar": 3, "statement": 3, "token": 3, "awar": 3, "page": 3, "queri": [3, 13], "revers": 3, "read": 3, "allow": 3, "filter": 3, "consist": [3, 14], "level": [3, 8], "cross": 3, "dc": 3, "request": 3, "us": [4, 11, 13, 14], "docker": [4, 9, 11], "compos": 4, "prerequisit": [4, 11, 14], "set": 4, "grafana": [4, 8, 9, 11, 12, 14], "provis": 4, "data": [4, 8, 11, 13], "sourc": [4, 8, 13], "file": [4, 8, 11], "dashboard": [4, 11, 14], "load": 4, "start": [4, 8, 11, 12], "stop": [4, 11], "support": [6, 12], "matrix": 6, "minim": [7, 9, 11], "product": [7, 9, 11], "system": [7, 9, 11, 14], "recommend": [7, 9, 11], "calcul": [7, 9, 11], "disk": [7, 9, 11], "space": [7, 9, 11], "requir": [7, 9, 11], "troubleshoot": 8, "problem": 8, "manag": [8, 11, 12], "2": 8, "duplic": 8, "inform": 8, "A": 8, "contain": 8, "fail": 8, "To": 8, "And": 8, "directori": [8, 11], "permiss": 8, "No": 8, "point": 8, "solut": 8, "chart": 8, "show": 8, "error": 8, "sign": 8, "server": 8, "metric": 8, "notic": 8, "user": 8, "upgrad": [8, 14], "open": 8, "3": 8, "0": 8, "enterpris": 8, "2019": 8, "1": 8, "work": 8, "wireshark": 8, "deploi": 9, "without": 9, "instal": [9, 11], "interfac": 10, "post": 11, "configur": [11, 13], "node": 11, "from": [11, 14], "consul": 11, "api": 11, "connect": 11, "extern": 11, "add": 11, "addit": 11, "target": 11, "specif": 11, "version": 11, "access": 11, "localhost": 11, "rsyslog": 11, "each": 11, "view": 11, "all": 12, "sh": [12, 14], "command": 12, "gener": [12, 14], "option": 12, "relat": 12, "ldap": 12, "retent": 12, "period": 12, "thano": 13, "With": 13, "As": 13, "aggreg": 13, "sidecar": 13, "updat": 13, "modifi": 14, "limit": 14, "between": 14, "restart": 14, "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": 14}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Alerting": [[2, "alerting"]], "Prometheus Alerts": [[2, "prometheus-alerts"]], "Alertmanager": [[2, "alertmanager"]], "Tips When Adding an Alert": [[2, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Advisor": [[1, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[1, "the-advisor-section"]], "Scylla Monitoring Stack": [[5, "scylla-monitoring-stack"]], "The CQL Optimization": [[3, "the-cql-optimization"]], "Prepared Statements": [[3, "prepared-statements"]], "Token Aware": [[3, "token-aware"]], "Paged Queries": [[3, "paged-queries"]], "Reversed CQL Reads": [[3, "reversed-cql-reads"]], "ALLOW FILTERING": [[3, "allow-filtering"]], "Consistency Level": [[3, "consistency-level"]], "Cross DC": [[3, "cross-dc"]], "Cross DC Consistency Level": [[3, "cross-dc-consistency-level"]], "Cross DC read requests": [[3, "cross-dc-read-requests"]], "Using Docker Compose": [[4, "using-docker-compose"]], "Prerequisite": [[4, "prerequisite"], [14, "prerequisite"]], "Setting Prometheus": [[4, "setting-prometheus"]], "Setting Grafana Provisioning": [[4, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[4, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[4, "grafana-dashboard-load-file"]], "Docker Compose file": [[4, "docker-compose-file"]], "Start and Stop": [[4, "start-and-stop"]], "Scylla Monitoring Stack Support Matrix": [[6, "scylla-monitoring-stack-support-matrix"]], "Minimal Production System Recommendations": [[7, "minimal-production-system-recommendations"], [9, "minimal-production-system-recommendations"], [11, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[7, "calculating-prometheus-minimal-disk-space-requirement"], [9, "calculating-prometheus-minimal-disk-space-requirement"], [11, "calculating-prometheus-minimal-disk-space-requirement"]], "Troubleshoot Scylla Monitoring Stack": [[8, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[8, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[8, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[8, "a-container-fails-to-start"]], "Files And Directory Permissions": [[8, "files-and-directory-permissions"]], "No Data Points": [[8, "no-data-points"]], "Solution": [[8, "solution"], [8, "id1"], [8, "id2"], [8, "id3"]], "Grafana Chart Shows Error (!) Sign": [[8, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[8, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[8, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[8, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[8, "working-with-wireshark"]], "Deploying Scylla Monitoring Stack Without Docker": [[9, "deploying-scylla-monitoring-stack-without-docker"]], "Install Scylla Monitoring Stack": [[9, "install-scylla-monitoring-stack"], [11, "install-scylla-monitoring-stack"], [11, "id1"]], "Install Alertmanager": [[9, "install-alertmanager"]], "Install Prometheus": [[9, "install-prometheus"]], "Install Grafana": [[9, "install-grafana"]], "Prerequisites": [[11, "prerequisites"]], "Docker Post Installation": [[11, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[11, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[11, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[11, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[11, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[11, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[11, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[11, "start-and-stop-scylla-monitoring-stack"]], "Start": [[11, "start"]], "Stop": [[11, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[11, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[11, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[11, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[11, "view-grafana-dashboards"]], "Scylla Monitoring Stack Interfaces": [[10, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[10, "prometheus"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "consistency between restarts": [[14, "consistency-between-restarts"]], "consistency between upgrades": [[14, "consistency-between-upgrades"]], "Using templated Dashboards": [[14, "using-templated-dashboards"]], "The template class system": [[14, "the-template-class-system"]], "Panel example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Validation": [[14, "validation"]], "The start-all.sh command": [[12, "the-start-all-sh-command"]], "General Options": [[12, "general-options"]], "Grafana Related Commands": [[12, "grafana-related-commands"]], "Grafana LDAP support": [[12, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[12, "prometheus-related-commands"]], "Prometheus Retention Period": [[12, "prometheus-retention-period"]], "Alert Manager": [[12, "alert-manager"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[13, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[13, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[13, "prometheus-configuration"]], "Thanos sidecar": [[13, "thanos-sidecar"]], "Thanos query": [[13, "thanos-query"]], "Update Scylla Data source": [[13, "update-scylla-data-source"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.6/sitemap.xml b/branch-3.6/sitemap.xml new file mode 100644 index 000000000..8a0d65a13 --- /dev/null +++ b/branch-3.6/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/advisor.htmlhttps://monitoring.docs.scylladb.com/stable/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.6/start_all.html b/branch-3.6/start_all.html new file mode 100644 index 000000000..f5b985970 --- /dev/null +++ b/branch-3.6/start_all.html @@ -0,0 +1,706 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            The start-all.sh command

            +

            Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

            +

            The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

            +
            +

            General Options

            +

            -h Help, Print the help, and exit.

            +

            –version print the current Scylla-Monitoring stack version, and exit.

            +

            -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

            +

            -A bind-to-ip-address Bind the listening-address to an explicit IP address.

            +

            -D encapsulate docker param Allows passing additional parameters to all the docker containers.

            +

            –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

            +
            + + +
            +

            Alert Manager

            +

            alertmanager handles the alerts and takes the following parameters:

            +

            -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

            +

            -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

            +

            -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/thanos.html b/branch-3.6/thanos.html new file mode 100644 index 000000000..6daae721c --- /dev/null +++ b/branch-3.6/thanos.html @@ -0,0 +1,709 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Using Thanos as Data Source With Scylla Monitoring Stack

            +

            Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as:

            +
              +
            • High-availability.

            • +
            • Horizontal scaling.

            • +
            • Backup.

            • +
            +

            The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

            +

            The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

            +
            +

            Using Thanos As a Prometheus Aggregator

            +

            There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

            +
            +

            Prometheus Configuration

            +

            We will assume you have two Prometheus servers running.

            +
              +
            1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

            2. +
            3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

            4. +
            +
            +
            +

            Thanos sidecar

            +

            The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

            +
            docker run -d \
            + -v /path/to/prom/dir:/data/prom:z \
            + -i --name sidecar thanosio/thanos \
            + sidecar \
            + --grpc-address=0.0.0.0:10911 \
            + --grpc-grace-period=1s \
            + --http-address=0.0.0.0:10912 \
            + --http-grace-period=1s \
            + --prometheus.url=http://prometheus-ip:9090 \
            + --tsdb.path=/data/prom \
            + -p 10912:10912 \
            + -p 10911:10911
            +
            +
            +

            After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

            +
            +
            +

            Thanos query

            +

            Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

            +
            docker run -d \
            + --name thanos -- thanosio/thanos \
            +   query \
            +   --debug.name=query0 \
            +   --log.level=debug \
            +   --grpc-address=0.0.0.0:10903 \
            +   --grpc-grace-period=1s \
            +   --http-address=0.0.0.0:10904 \
            +   --http-grace-period=1s \
            +   --query.replica-label=prometheus \
            +   --store={ip1}:10911 --store={ip2}:10911
            +
            +
            +

            After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

            +
            +
            +

            Update Scylla Data source

            +

            The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

            +

            The file you edit is a template file that replaces the file Grafana uses, next time you start.

            +

            Restart the Scylla Monitoring Stack it should now use Thanos.

            +
            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/updating_dashboard.html b/branch-3.6/updating_dashboard.html new file mode 100644 index 000000000..0db88c56d --- /dev/null +++ b/branch-3.6/updating_dashboard.html @@ -0,0 +1,915 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Adding and Modifying Dashboards

            +

            The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

            +

            It will explain about Scylla Monitoring Stack dashboard templates and how to modify them.

            + +
            +

            General Limitations

            +

            Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades.

            +
            +

            consistency between restarts

            +

            By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana.

            +
            +
            +

            consistency between upgrades

            +

            As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

            +
            +

            Note

            +

             You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided.

            +
            +

            At large, we suggest maintaining your dashboards as files, as Scylla Monitor does.

            +
            +
            +
            +

            Using templated Dashboards

            +

            Why does Scylla Monitor use dashboard templates?

            +

            We found the Grafana dashboards Json format too verbose to be maintainable.

            +

            Each element in the dashboard file (Each Json object) contains all of its attributes and values.

            +

            For example a typical graph panel would look like:

            +
            {
            +    "aliasColors": {},
            +    "bars": false,
            +    "datasource": "prometheus",
            +    "editable": true,
            +    "error": false,
            +    "fill": 0,
            +    "grid": {
            +        "threshold1": null,
            +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
            +        "threshold2": null,
            +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
            +    },
            +    "gridPos": {
            +        "h": 6,
            +        "w": 10,
            +        "x": 0,
            +        "y": 4
            +    },
            +    "id": 2,
            +    "isNew": true,
            +    "legend": {
            +        "avg": false,
            +        "current": false,
            +        "max": false,
            +        "min": false,
            +        "show": false,
            +        "total": false,
            +        "values": false
            +    },
            +    "lines": true,
            +    "linewidth": 2,
            +    "links": [],
            +    "nullPointMode": "connected",
            +    "percentage": false,
            +    "pointradius": 5,
            +    "points": false,
            +    "renderer": "flot",
            +    "seriesOverrides": [
            +        {}
            +    ],
            +    "span": 5,
            +    "stack": false,
            +    "steppedLine": false,
            +    "targets": [
            +        {
            +            "expr": "sum(node_filesystem_avail) by (instance)",
            +            "intervalFactor": 1,
            +            "legendFormat": "",
            +            "refId": "A",
            +            "step": 1
            +        }
            +    ],
            +    "timeFrom": null,
            +    "timeShift": null,
            +    "title": "Available Disk Size",
            +    "tooltip": {
            +        "msResolution": false,
            +        "shared": true,
            +        "sort": 0,
            +        "value_type": "cumulative"
            +    },
            +    "transparent": false,
            +    "type": "graph",
            +    "xaxis": {
            +        "show": true
            +    },
            +    "yaxes": [
            +        {
            +            "format": "percent",
            +            "logBase": 1,
            +            "max": 101,
            +            "min": 0,
            +            "show": true
            +        },
            +        {
            +            "format": "short",
            +            "logBase": 1,
            +            "max": null,
            +            "min": null,
            +            "show": true
            +        }
            +    ]
            +}
            +
            +
            +

            As you can imagine, most panels would have similar values.

            +

            To reduce the redundancy of Grafana JSON format, we added dashboard templates.

            +
            +

            The template class system

            +

            Scylla Monitoring Stack dashboard templates use class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

            +

            The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes.

            +

            In the template file, you can also add or override attributes.

            +

            The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

            +

            When generating dashboards, each class will be replaced by its definition.

            +

            For example row in the type.json defined

            +
            {
            + "base_row": {
            +     "collapse": false,
            +     "editable": true
            + },
            + "row": {
            +     "class": "base_row",
            +     "height": "250px"
            + }
            + }
            +
            +
            +

            In a Template it will be used like

            +
            {
            +     "class": "row",
            +     "height": "150px",
            +     "panels": [
            +     ]
            +}
            +
            +
            +

            The output will be

            +
            {
            +     "class": "row",
            +     "collapse": false,
            +     "editable": true,
            +     "height": "150px",
            +     "panels": [
            +
            +     ]
            +}
            +
            +
            +

            We can see that the template added the panels attribute and override the height attribute.

            +
            +
            +

            Panel example

            +

            Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

            +
            {
            +     "class": "row",
            +     "panels": [
            +         {
            +             "class": "bytes_panel",
            +             "span": 3,
            +             "targets": [
            +                 {
            +                     "expr": "sum(node_filesystem_avail) by (instance)",
            +                     "intervalFactor": 1,
            +                     "legendFormat": "",
            +                     "metric": "",
            +                     "refId": "A",
            +                     "step": 1
            +                 }
            +             ],
            +             "title": "Available Disk Size"
            +         }
            +     ]
            +}
            +
            +
            +

            In the example, we used the bytes_panel class that generate a graph with bytes as units (that would mean that your +Y axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’)

            +

            You can also see that we override the span attribute to set the panel size.

            +

            To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

            +
            +
            +

            Grafana Formats and Layouts

            +

            The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

            +

            Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width).

            +

            The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

            +

            To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

            +

            The panel’s height will be taken from their row. The span attribute is still supported as is row height.

            +

            you can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

            +

            gridPos has the following attributes:

            +
            {
            +   "x": 0,
            +   "y": 0,
            +   "w": 24,
            +   "h": 4
            + }
            +
            +
            +

            When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

            +
            {
            +   "gridPos": {
            +      "h": 2
            +    }
            +}
            +
            +
            +
            +
            +

            Generating the dashboards from templates (generate-dashboards.sh)

            +
            +

            Prerequisite

            +

            Python 2.7

            +

            make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

            +

            Use the -h flag to get help information.

            +

            You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

            +

            When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

            +

            For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

            +

            .\generate-dashboards.sh -v 2020.1

            +
            +

            Note

            +

            generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard.

            +
            +
            +
            +
            +

            Validation

            +

            After making changes to a template, run the generate_generate-dashboards.sh you should see that it run without any errors.

            +

            Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

            +
            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.7/.buildinfo b/branch-3.7/.buildinfo new file mode 100644 index 000000000..25bffe334 --- /dev/null +++ b/branch-3.7/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: c94dfa755b7ea1e8a24c611397b2fc47 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-3.7/.doctrees/_common/monitor-description.doctree b/branch-3.7/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..868b3eeb1 Binary files /dev/null and b/branch-3.7/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-3.7/.doctrees/environment.pickle b/branch-3.7/.doctrees/environment.pickle new file mode 100644 index 000000000..7c6fce7f1 Binary files /dev/null and b/branch-3.7/.doctrees/environment.pickle differ diff --git a/branch-3.7/.doctrees/index.doctree b/branch-3.7/.doctrees/index.doctree new file mode 100644 index 000000000..e5fcdb21d Binary files /dev/null and b/branch-3.7/.doctrees/index.doctree differ diff --git a/branch-3.7/.doctrees/install/docker_compose.doctree b/branch-3.7/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..4ff1d2a17 Binary files /dev/null and b/branch-3.7/.doctrees/install/docker_compose.doctree differ diff --git a/branch-3.7/.doctrees/install/index.doctree b/branch-3.7/.doctrees/install/index.doctree new file mode 100644 index 000000000..f37ea1a29 Binary files /dev/null and b/branch-3.7/.doctrees/install/index.doctree differ diff --git a/branch-3.7/.doctrees/install/min-prod-hw.doctree b/branch-3.7/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..74b5d2802 Binary files /dev/null and b/branch-3.7/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-3.7/.doctrees/install/monitor_without_docker.doctree b/branch-3.7/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..b1f0afe44 Binary files /dev/null and b/branch-3.7/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-3.7/.doctrees/install/monitoring_stack.doctree b/branch-3.7/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..09fef4eb2 Binary files /dev/null and b/branch-3.7/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-3.7/.doctrees/install/start_all.doctree b/branch-3.7/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..801d75fac Binary files /dev/null and b/branch-3.7/.doctrees/install/start_all.doctree differ diff --git a/branch-3.7/.doctrees/install/thanos.doctree b/branch-3.7/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..c54e8325c Binary files /dev/null and b/branch-3.7/.doctrees/install/thanos.doctree differ diff --git a/branch-3.7/.doctrees/procedures/alerts/alerting.doctree b/branch-3.7/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..ace604dbf Binary files /dev/null and b/branch-3.7/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-3.7/.doctrees/procedures/alerts/index.doctree b/branch-3.7/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..905430ff9 Binary files /dev/null and b/branch-3.7/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-3.7/.doctrees/procedures/index.doctree b/branch-3.7/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..b022bc260 Binary files /dev/null and b/branch-3.7/.doctrees/procedures/index.doctree differ diff --git a/branch-3.7/.doctrees/procedures/updating_dashboard.doctree b/branch-3.7/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..50ee39057 Binary files /dev/null and b/branch-3.7/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-3.7/.doctrees/reference/index.doctree b/branch-3.7/.doctrees/reference/index.doctree new file mode 100644 index 000000000..7ca9c503e Binary files /dev/null and b/branch-3.7/.doctrees/reference/index.doctree differ diff --git a/branch-3.7/.doctrees/reference/matrix.doctree b/branch-3.7/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..020a29f71 Binary files /dev/null and b/branch-3.7/.doctrees/reference/matrix.doctree differ diff --git a/branch-3.7/.doctrees/reference/monitoring_apis.doctree b/branch-3.7/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..fa24eb82c Binary files /dev/null and b/branch-3.7/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-3.7/.doctrees/troubleshooting/index.doctree b/branch-3.7/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..daef22410 Binary files /dev/null and b/branch-3.7/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-3.7/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-3.7/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..c6fba6639 Binary files /dev/null and b/branch-3.7/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..f0ba1b97b Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..768d616c3 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..f3eb5b276 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..ff4bd8438 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..f5400f7b6 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..cf3450f70 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..fd4aea975 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/index.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..37a0e7afd Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..9a326c0ad Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..553803d7a Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..270f06075 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..4d3e60b33 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/cql_optimization.doctree b/branch-3.7/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..1e7682a74 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/index.doctree b/branch-3.7/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..6f2710d33 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-3.7/.nojekyll b/branch-3.7/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-3.7/404.html b/branch-3.7/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-3.7/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
            +

            404

            +

            The ScyllaDB monster ate your page!

            +

            + Home +

            +
            + + + \ No newline at end of file diff --git a/branch-3.7/CNAME b/branch-3.7/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-3.7/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-3.7/_common/monitor-description.html b/branch-3.7/_common/monitor-description.html new file mode 100644 index 000000000..79e428a28 --- /dev/null +++ b/branch-3.7/_common/monitor-description.html @@ -0,0 +1,640 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +

            Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

            + + +
            + + + + + +
            + + +
            + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.7/_images/1.png b/branch-3.7/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.7/_images/1.png differ diff --git a/branch-3.7/_images/2.png b/branch-3.7/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.7/_images/2.png differ diff --git a/branch-3.7/_images/3.png b/branch-3.7/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.7/_images/3.png differ diff --git a/branch-3.7/_images/advisor_panel.png b/branch-3.7/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-3.7/_images/advisor_panel.png differ diff --git a/branch-3.7/_images/alertmanager.png b/branch-3.7/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.7/_images/alertmanager.png differ diff --git a/branch-3.7/_images/cql_optimization_master.png b/branch-3.7/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.7/_images/cql_optimization_master.png differ diff --git a/branch-3.7/_images/grafana.png b/branch-3.7/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.7/_images/grafana.png differ diff --git a/branch-3.7/_images/monitor.png b/branch-3.7/_images/monitor.png new file mode 100644 index 000000000..26d107a71 Binary files /dev/null and b/branch-3.7/_images/monitor.png differ diff --git a/branch-3.7/_images/monitoring_stack.png b/branch-3.7/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.7/_images/monitoring_stack.png differ diff --git a/branch-3.7/_sources/_common/monitor-description.rst.txt b/branch-3.7/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-3.7/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.7/_sources/index.rst.txt b/branch-3.7/_sources/index.rst.txt new file mode 100644 index 000000000..4ab026528 --- /dev/null +++ b/branch-3.7/_sources/index.rst.txt @@ -0,0 +1,36 @@ +Scylla Monitoring Stack +======================= + +.. toctree:: + :maxdepth: 1 + :hidden: + + User Guide + Download and Install + Procedures + Troubleshooting + Reference + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + + +For older versions of Scylla Monitoring Stack Documentation see `here `_. diff --git a/branch-3.7/_sources/install/docker_compose.rst.txt b/branch-3.7/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-3.7/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-3.7/_sources/install/index.rst.txt b/branch-3.7/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-3.7/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-3.7/_sources/install/min-prod-hw.rst.txt b/branch-3.7/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..db5d9c860 --- /dev/null +++ b/branch-3.7/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,24 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need **minimal** disk space of + +.. code:: + + 6 * 16 * 200MB ~ 20GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. diff --git a/branch-3.7/_sources/install/monitor_without_docker.rst.txt b/branch-3.7/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..f272f6d7d --- /dev/null +++ b/branch-3.7/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,381 @@ +Deploying Scylla Monitoring Stack Without Docker +================================================ + +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before beginning that your Grafana and Prometheus versions are supported by the Monitoring Stack version you want to install. See the :ref:`Scylla Monitoring Stack Compatibility Matrix `. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +``wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz`` + + +2. Open the tar + +``tar -xvf scylla-monitoring-3.5.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.20.0 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz + tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.20.0.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + + +Install Prometheus +------------------ + +Tested with Prometheus version 2.18.1 + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz + tar -xvf prometheus-2.18.1.linux-amd64.tar.gz + +2. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64 + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml + + +3. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi prometheus-2.18.1.linux-amd64/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +4. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:56090 + +5. Create a data directory for Prometheus to store the metrics data + +For example: + +.. code-block:: shell + + mkdir prometheus-2.18.1.linux-amd64/mydata + + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + + cd prometheus-2.18.1.linux-amd64 + ./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata + +Data should start accumulate on: ./mydata + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + + +Install Grafana +--------------- + +Tested with Grafna 6.7.3 + +1. Install Grafana based on the instructions `here`_ make sure to use version 6.7.0 or higher + +.. _`here` : http://docs.grafana.org/installation/ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +``cd scylla-monitoring-scylla-monitoring-3.5/`` + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-6.7.3/public/app + +4. Provision the Dashboard them + +For example Scylla version 4.0 and Scylla manager version 2.0 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-6.7.3/public/build/ + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-6.7.3/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.0.yaml`` would point to: ``/home/centos/grafana-6.7.3/public/build/ver_4.0`` and the FOLDER will be ``4.0`` + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-6.7.3/data/plugins + provisioning = /home/centos/grafana-6.7.3/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-6.7.3/ + ./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + diff --git a/branch-3.7/_sources/install/monitoring_stack.rst.txt b/branch-3.7/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..82f134921 --- /dev/null +++ b/branch-3.7/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,378 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +.. contents:: + :depth: 2 + :local: + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API`_. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +.. _`Scylla Prometheus API`: monitoring_apis#prometheus + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can `Deploy Scylla Monitoring Stack Without Docker `_ . +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. _Monitoring_Stack_Compatibility_Matrix: + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout branch-3.7 + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://scylladb.github.io/scylla-manager/2.2/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-3.7/_sources/install/start_all.rst.txt b/branch-3.7/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..752a98a12 --- /dev/null +++ b/branch-3.7/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh command +======================== + +Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "-storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.7/_sources/install/thanos.rst.txt b/branch-3.7/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..ffaf430af --- /dev/null +++ b/branch-3.7/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912 + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903 + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + \ No newline at end of file diff --git a/branch-3.7/_sources/procedures/alerts/alerting.rst.txt b/branch-3.7/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.7/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.7/_sources/procedures/alerts/index.rst.txt b/branch-3.7/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-3.7/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-3.7/_sources/procedures/index.rst.txt b/branch-3.7/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..5ad1f631f --- /dev/null +++ b/branch-3.7/_sources/procedures/index.rst.txt @@ -0,0 +1,18 @@ +========================================= +Scylla Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Alert Manager + Adding and Modifying Dashboards + Upgrade Guide + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* `Upgrade Guide `_ diff --git a/branch-3.7/_sources/procedures/updating_dashboard.rst.txt b/branch-3.7/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..5113102a8 --- /dev/null +++ b/branch-3.7/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,302 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It will explain about Scylla Monitoring Stack dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades. + +consistency between restarts +**************************** + +By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana. + +consistency between upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitor does. + + +Using templated Dashboards +########################## +Why does Scylla Monitor use dashboard templates? + +We found the Grafana dashboards Json format too verbose to be maintainable. + +Each element in the dashboard file (Each Json object) contains all of its attributes and values. + +For example a typical graph panel would look like: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of Grafana JSON format, we added dashboard templates. + +The template class system +*************************** + +Scylla Monitoring Stack dashboard templates use ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example row in the `type.json` defined + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +In a Template it will be used like + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +The output will be + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and override the ``height`` attribute. + + +Panel example +************* + +Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, we used the `bytes_panel` class that generate a graph with bytes as units (that would mean that your +`Y` axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc') + +You can also see that we override the `span` attribute to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +you can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` you should see that it run without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.7/_sources/reference/index.rst.txt b/branch-3.7/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-3.7/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-3.7/_sources/reference/matrix.rst.txt b/branch-3.7/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..f79874ca6 --- /dev/null +++ b/branch-3.7/_sources/reference/matrix.rst.txt @@ -0,0 +1,100 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.7/_sources/reference/monitoring_apis.rst.txt b/branch-3.7/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..6d64821bc --- /dev/null +++ b/branch-3.7/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see `Scylla Monitoring Stack `_ + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.7/_sources/troubleshooting/index.rst.txt b/branch-3.7/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-3.7/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-3.7/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-3.7/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..2cc1457ea --- /dev/null +++ b/branch-3.7/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,225 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +.. contents:: + :depth: 1 + :local: + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..98a3b14d3 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/scylla-essentials-overview/lessons/high-availability/topic/consistency-level/#:~:text=Some%20of%20the%20most%20common,availability%20with%20the%20lowest%20consistency. diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-3.7/_sources/use-monitoring/advisor/index.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..27758a7a3 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,43 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` diff --git a/branch-3.7/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-3.7/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-3.7/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-3.7/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-3.7/_sources/use-monitoring/cql_optimization.rst.txt b/branch-3.7/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..eafc82e4b --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-3.7/_sources/use-monitoring/index.rst.txt b/branch-3.7/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-3.7/_static/basic.css b/branch-3.7/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.7/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.7/_static/check-solid.svg b/branch-3.7/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.7/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.7/_static/clipboard.min.js b/branch-3.7/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.7/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.7/_static/copybutton.css b/branch-3.7/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.7/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

            Short

            + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.7/_static/copybutton.js b/branch-3.7/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.7/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.7/_static/copybutton_funcs.js b/branch-3.7/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.7/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.7/_static/css/main.css b/branch-3.7/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-3.7/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.7/_static/doctools.js b/branch-3.7/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.7/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.7/_static/documentation_options.js b/branch-3.7/_static/documentation_options.js new file mode 100644 index 000000000..237299273 --- /dev/null +++ b/branch-3.7/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.3.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.7/_static/file.png b/branch-3.7/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.7/_static/file.png differ diff --git a/branch-3.7/_static/img/banner-background.svg b/branch-3.7/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.7/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.7/_static/img/favicon-228x228.png b/branch-3.7/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.7/_static/img/favicon-228x228.png differ diff --git a/branch-3.7/_static/img/favicon-32x32.png b/branch-3.7/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.7/_static/img/favicon-32x32.png differ diff --git a/branch-3.7/_static/img/favicon.ico b/branch-3.7/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.7/_static/img/favicon.ico differ diff --git a/branch-3.7/_static/img/icons/icon-about-team.svg b/branch-3.7/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.7/_static/img/icons/icon-about-us-m.svg b/branch-3.7/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-about-us.svg b/branch-3.7/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-alternator.svg b/branch-3.7/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-apps.svg b/branch-3.7/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-architecture.svg b/branch-3.7/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.7/_static/img/icons/icon-benchmarks.svg b/branch-3.7/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.7/_static/img/icons/icon-blog.svg b/branch-3.7/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.7/_static/img/icons/icon-careers.svg b/branch-3.7/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.7/_static/img/icons/icon-chevron-left.svg b/branch-3.7/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.7/_static/img/icons/icon-chevron-right.svg b/branch-3.7/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.7/_static/img/icons/icon-circe.svg b/branch-3.7/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-clock.svg b/branch-3.7/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-close.svg b/branch-3.7/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-cloud-docs.svg b/branch-3.7/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-cloud.svg b/branch-3.7/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-comparison.svg b/branch-3.7/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.7/_static/img/icons/icon-contact-us.svg b/branch-3.7/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.7/_static/img/icons/icon-developers-blog.svg b/branch-3.7/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.7/_static/img/icons/icon-docs.svg b/branch-3.7/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.7/_static/img/icons/icon-enterprise-m.svg b/branch-3.7/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-enterprise.svg b/branch-3.7/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-events.svg b/branch-3.7/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.7/_static/img/icons/icon-exclamation.svg b/branch-3.7/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-expand.svg b/branch-3.7/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-forum.svg b/branch-3.7/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-getting-started.svg b/branch-3.7/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-glossary.svg b/branch-3.7/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-home.svg b/branch-3.7/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-infoworld.svg b/branch-3.7/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.7/_static/img/icons/icon-integrations.svg b/branch-3.7/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-knowledge-base.svg b/branch-3.7/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-less.svg b/branch-3.7/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-live-test.svg b/branch-3.7/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.7/_static/img/icons/icon-mail-list.svg b/branch-3.7/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-manager.svg b/branch-3.7/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.7/_static/img/icons/icon-memory-management.svg b/branch-3.7/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.7/_static/img/icons/icon-modeling.svg b/branch-3.7/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-monitoring.svg b/branch-3.7/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.7/_static/img/icons/icon-networking.svg b/branch-3.7/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.7/_static/img/icons/icon-news.svg b/branch-3.7/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.7/_static/img/icons/icon-newsletter.svg b/branch-3.7/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.7/_static/img/icons/icon-nsql-guides.svg b/branch-3.7/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.7/_static/img/icons/icon-open-source.svg b/branch-3.7/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.7/_static/img/icons/icon-operator.svg b/branch-3.7/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-overview.svg b/branch-3.7/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.7/_static/img/icons/icon-partners.svg b/branch-3.7/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.7/_static/img/icons/icon-plus.svg b/branch-3.7/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-pricing.svg b/branch-3.7/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.7/_static/img/icons/icon-release-notes.svg b/branch-3.7/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.7/_static/img/icons/icon-resource-center.svg b/branch-3.7/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.7/_static/img/icons/icon-roadmap.svg b/branch-3.7/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.7/_static/img/icons/icon-search.svg b/branch-3.7/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.7/_static/img/icons/icon-slack.svg b/branch-3.7/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-stack-overflow.svg b/branch-3.7/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.7/_static/img/icons/icon-summit.svg b/branch-3.7/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-support.svg b/branch-3.7/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.7/_static/img/icons/icon-tech-talks.svg b/branch-3.7/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.7/_static/img/icons/icon-testing.svg b/branch-3.7/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.7/_static/img/icons/icon-thumbs-down.svg b/branch-3.7/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-thumbs-up.svg b/branch-3.7/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-tip.svg b/branch-3.7/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.7/_static/img/icons/icon-training.svg b/branch-3.7/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.7/_static/img/icons/icon-triangle-down.svg b/branch-3.7/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.7/_static/img/icons/icon-university.svg b/branch-3.7/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.7/_static/img/icons/icon-users-blog.svg b/branch-3.7/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.7/_static/img/icons/icon-warning.svg b/branch-3.7/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-webinars.svg b/branch-3.7/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.7/_static/img/icons/icon-whitepapers.svg b/branch-3.7/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.7/_static/img/icons/icon-workshop.svg b/branch-3.7/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/logo-docs.svg b/branch-3.7/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.7/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.7/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.7/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.7/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.7/_static/img/mascots/404.jpg b/branch-3.7/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.7/_static/img/mascots/404.jpg differ diff --git a/branch-3.7/_static/img/mascots/scylla-3monsters.png b/branch-3.7/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.7/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-alternator.svg b/branch-3.7/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.7/_static/img/mascots/scylla-cloud.svg b/branch-3.7/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.7/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.7/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-computer-headset.png b/branch-3.7/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-cup-number-one.png b/branch-3.7/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-docs.svg b/branch-3.7/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.7/_static/img/mascots/scylla-drivers.svg b/branch-3.7/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.7/_static/img/mascots/scylla-enterprise.svg b/branch-3.7/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.7/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.7/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-forklift-migration.png b/branch-3.7/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-gear.png b/branch-3.7/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-hardhat.png b/branch-3.7/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-headband.png b/branch-3.7/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-headset.png b/branch-3.7/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-hearts.png b/branch-3.7/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-looking-down.png b/branch-3.7/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-looking-up.png b/branch-3.7/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.7/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.7/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-manager.svg b/branch-3.7/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.7/_static/img/mascots/scylla-monitor.svg b/branch-3.7/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.7/_static/img/mascots/scylla-movement-fast.png b/branch-3.7/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-movement.png b/branch-3.7/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-onpremise.png b/branch-3.7/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-opensource.svg b/branch-3.7/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.7/_static/img/mascots/scylla-operator.svg b/branch-3.7/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.7/_static/img/mascots/scylla-plugin.png b/branch-3.7/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-release-mascot.png b/branch-3.7/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-repair.png b/branch-3.7/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-server.png b/branch-3.7/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-sleeping.png b/branch-3.7/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-tall-measure.png b/branch-3.7/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-university.png b/branch-3.7/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-weights.png b/branch-3.7/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-window-cleaning.png b/branch-3.7/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-with-computer-2.png b/branch-3.7/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-with-computer.png b/branch-3.7/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-with-linux.png b/branch-3.7/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-writting.png b/branch-3.7/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.7/_static/img/menu.svg b/branch-3.7/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.7/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.7/_static/img/scylla-monitor.png b/branch-3.7/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.7/_static/img/scylla-monitor.png differ diff --git a/branch-3.7/_static/js/main.bundle.js b/branch-3.7/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-3.7/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
          • Back
          • ',backButtonPosition:"top",wrapper:"
            ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
              "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
              ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
              ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
              ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
              ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
              "],col:[2,"","
              "],tr:[2,"","
              "],td:[3,"","
              "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + + + +
              + + + + + +
              + + +
              + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/index.html b/branch-3.7/index.html new file mode 100644 index 000000000..bccec7ffa --- /dev/null +++ b/branch-3.7/index.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack

              +
              +
              +

              Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

              +_images/monitor.png +

              The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

              +
                +
              • prometheus - collects and stores metrics

              • +
              • alertmanager - handles alerts

              • +
              • grafana - dashboard server

              • +
              +

              Choose a topic to get started:

              + +

              For older versions of Scylla Monitoring Stack Documentation see here.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/docker_compose.html b/branch-3.7/install/docker_compose.html new file mode 100644 index 000000000..ddb4e90ce --- /dev/null +++ b/branch-3.7/install/docker_compose.html @@ -0,0 +1,804 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Using Docker Compose

              +

              Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

              +

              Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

              +
              +

              Warning

              +

              docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

              +
              +
              +

              Prerequisite

              +

              Make sure you have docker and docker-compose installed.

              +
              +
              +

              Setting Prometheus

              +

              The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

              +

              You can use ./prometheus-config.sh to generate the file, for example:

              +
              ./prometheus-config.sh --compose
              +
              +
              +

              For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

              +
              +
              +

              Setting Grafana Provisioning

              +

              Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

              +
              +

              Grafana Data-Source file

              +

              Run the following command to update the datasource:

              +
              ./grafana-datasource.sh --compose
              +
              +
              +

              You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

              +
              +
              +

              Grafana Dashboard Load file

              +

              To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

              +
              ./generate-dashboards.sh -t -v 2020.1
              +
              +
              +

              This command generates the files under: grafana/provisioning/dashboards/

              +
              +
              +
              +

              Docker Compose file

              +

              You can use the following example as a base for your docker compose.

              +

              Pass the following to a file called docker-compose.yml

              +
              services:
              +  alertmanager:
              +    container_name: aalert
              +    image: prom/alertmanager:v0.21.0
              +    ports:
              +    - 9093:9093
              +    volumes:
              +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
              +  grafana:
              +    container_name: agraf
              +    environment:
              +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
              +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
              +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
              +    # This is where you set Grafana security
              +    - GF_AUTH_BASIC_ENABLED=false
              +    - GF_AUTH_ANONYMOUS_ENABLED=true
              +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
              +    - GF_SECURITY_ADMIN_PASSWORD=admin
              +    image: grafana/grafana:7.3.5
              +    ports:
              +    - 3000:3000
              +    user: 1000:1000
              +    volumes:
              +    - ./grafana/build:/var/lib/grafana/dashboards
              +    - ./grafana/plugins:/var/lib/grafana/plugins
              +    - ./grafana/provisioning:/var/lib/grafana/provisioning
              +    # Uncomment the following line for grafana persistency
              +    # - path/to/grafana/dir:/var/lib/grafana
              +  loki:
              +    command:
              +    - --config.file=/mnt/config/loki-config.yaml
              +    container_name: loki
              +    image: grafana/loki:2.0.0
              +    ports:
              +    - 3100:3100
              +    volumes:
              +    - ./loki/rules:/etc/loki/rules
              +    - ./loki/conf:/mnt/config
              +  promotheus:
              +    command:
              +    - --config.file=/etc/prometheus/prometheus.compose.yml
              +    container_name: aprom
              +    image: prom/prometheus:v2.18.1
              +    ports:
              +    - 9090:9090
              +    volumes:
              +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
              +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
              +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
              +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
              +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
              +    # Uncomment the following line for prometheus persistency 
              +    # - path/to/data/dir:/prometheus/data
              +  promtail:
              +    command:
              +    - --config.file=/etc/promtail/config.yml
              +    container_name: promtail
              +    image: grafana/promtail:2.0.0
              +    ports:
              +    - 1514:1514
              +    - 9080:9080
              +    volumes:
              +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
              +version: '3'
              +
              +
              +
              +

              Start and Stop

              +

              To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

              +
              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/index.html b/branch-3.7/install/index.html new file mode 100644 index 000000000..477b0ee14 --- /dev/null +++ b/branch-3.7/install/index.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Download and Install Scylla Monitoring Stack

              +
              +
              +

              Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

              +

              Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/min-prod-hw.html b/branch-3.7/install/min-prod-hw.html new file mode 100644 index 000000000..a151bdef7 --- /dev/null +++ b/branch-3.7/install/min-prod-hw.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Minimal Production System Recommendations

              +
                +
              • CPU - at least 2 physical cores/ 4vCPUs

              • +
              • Memory - 15GB+ DRAM

              • +
              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

              • +
              • Network - 1GbE/10GbE preferred

              • +
              +
              +

              Calculating Prometheus Minimal Disk Space requirement

              +

              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

              +

              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

              +

              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

              +
              6 * 16 * 200MB ~ 20GB
              +
              +
              +

              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/monitor_without_docker.html b/branch-3.7/install/monitor_without_docker.html new file mode 100644 index 000000000..8d04e700a --- /dev/null +++ b/branch-3.7/install/monitor_without_docker.html @@ -0,0 +1,1000 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Deploying Scylla Monitoring Stack Without Docker

              +

              The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

              +

              Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

              +
              +

              Minimal Production System Recommendations

              +
                +
              • CPU - at least 2 physical cores/ 4vCPUs

              • +
              • Memory - 15GB+ DRAM

              • +
              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

              • +
              • Network - 1GbE/10GbE preferred

              • +
              +
              +

              Calculating Prometheus Minimal Disk Space requirement

              +

              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

              +

              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

              +

              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

              +
              6 * 16 * 200MB ~ 20GB
              +
              +
              +

              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

              +

              The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

              +
              +

              Note

              +

              Confirm before beginning that your Grafana and Prometheus versions are supported by the Monitoring Stack version you want to install. See the Scylla Monitoring Stack Compatibility Matrix.

              +
              +
              +
              +
              +

              Install Scylla Monitoring Stack

              +

              The following procedure uses a CentOS 7 based instance

              +
                +
              1. Download the latest Scylla Monitoring Stack release.

              2. +
              +

              wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz

              +
                +
              1. Open the tar

              2. +
              +

              tar -xvf scylla-monitoring-3.5.tar.gz

              +
              +
              +

              Install Alertmanager

              +

              Tested with alertmanager 0.20.0 version

              +
                +
              1. Install alertmanager

              2. +
              +
              wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz
              +tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz
              +
              +
              +
                +
              1. Copy the following file: rule_config.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to alertmanager.yml in the alertmanager installation directory.

              2. +
              +

              For example:

              +
              cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml
              +
              +
              +
                +
              1. Start the Alertmanager

              2. +
              +

              For example:

              +
              cd alertmanager-0.20.0.linux-amd64
              +./alertmanager
              +
              +
              +
                +
              1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

              2. +
              +

              For example:

              +
              http://192.168.135.166:9093/
              +
              +
              +../_images/alertmanager.png +
              +
              +

              Install Prometheus

              +

              Tested with Prometheus version 2.18.1

              +
                +
              1. Install Prometheus

              2. +
              +
              wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz
              +tar -xvf prometheus-2.18.1.linux-amd64.tar.gz
              +
              +
              +
                +
              1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to Prometheus installation directory.

              2. +
              +

              Copy prometheus/prometheus.yml.template to prometheus.yml

              +

              For example:

              +
              cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64
              +cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml
              +
              +
              +
                +
              1. Edit the prometheus.yml file to point to the correct static data sources.

              2. +
              +
              +

              Note

              +

              Make sure to include the honor_labels: false parameter in the prometheus.yml file.

              +
              +
              vi prometheus-2.18.1.linux-amd64/prometheus.yml
              +
              +
              +

              Set the alertmanger address and port by replacing AM_ADDRESS in the file.

              +

              For example if the alertmanager will run on the same host:

              +
              alerting:
              +   alertmanagers:
              +   - static_configs:
              +       - targets:
              +           - 127.0.0.1:9093
              +
              +
              +

              Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

              +

              For example the scrape config for Scylla:

              +
              global:
              +  scrape_interval: 5s # By default, scrape targets every 5 second.
              +  scrape_timeout: 4s # Timeout before trying to scape a target again
              +
              +  # Attach these labels to any time series or alerts when communicating with
              +  # external systems (federation, remote storage, Alertmanager).
              +  external_labels:
              +    monitor: 'scylla-monitor'
              +
              +scrape_configs:
              +- job_name: scylla
              +  honor_labels: false
              +  file_sd_configs:
              +    - files:
              +      - scylla_servers.yml
              +  relabel_configs:
              +    - source_labels: [__address__]
              +      regex:  '([^:]+)'
              +      target_label: __address__
              +      replacement: '${1}:9180'
              +
              +    - source_labels: [__address__]
              +      regex:  '(.*):.+'
              +      target_label: instance
              +      replacement: '${1}'
              +
              +
              +
                +
              1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

              2. +
              +
              +

              Note

              +

              There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

              +
              +

              An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

              +
              +

              Note

              +

              You must have both files even if you are not using Scylla Manager

              +
              +

              Add the labels for the cluster and data-center

              +

              scylla_servers.yml:

              +

              For example:

              +
              cat scylla_servers.yml
              +# List Scylla end points
              +
              +- targets:
              +  - 192.168.66.6
              +  - 192.168.66.244
              +  labels:
              +    cluster: cluster1
              +    dc: dc1
              +- targets:
              +    - 172.17.0.3
              +  labels:
              +    cluster: cluster1
              +    dc: dc2
              +
              +
              +
              +

              Note

              +

              See the previous note about deprecating the node_exporter_servers.yml file.

              +
              +

              scylla_manager_server.yml

              +

              For example:

              +
              - targets:
              +  - 127.0.0.1:56090
              +
              +
              +
                +
              1. Create a data directory for Prometheus to store the metrics data

              2. +
              +

              For example:

              +
              mkdir prometheus-2.18.1.linux-amd64/mydata
              +
              +
              +
                +
              1. Start Prometheus server:

              2. +
              +

              For example:

              +
              cd prometheus-2.18.1.linux-amd64
              +./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata
              +
              +
              +

              Data should start accumulate on: ./mydata

              +
                +
              1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

              2. +
              +

              For example:

              +
              http://192.168.135.166:9090/
              +
              +
              +../_images/1.png +

              Prometheus console should be visible

              +
                +
              1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

              2. +
              +

              For example:

              +

              node_memory_MemFree

              +../_images/2.png +

              And

              +

              scylla_reactor_utilization

              +../_images/3.png +

              At this point Scylla is emitting the metrics and Prometheus is able to store them.

              +
              +
              +

              Install Grafana

              +

              Tested with Grafna 6.7.3

              +
                +
              1. Install Grafana based on the instructions here make sure to use version 6.7.0 or higher

              2. +
              +

              Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

              +
                +
              1. Access Scylla-Grafana-monitoring directory

              2. +
              +

              cd scylla-monitoring-scylla-monitoring-3.5/

              +
                +
              1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

              2. +
              +
              sudo cp -r grafana/plugins /var/lib/grafana/
              +
              +
              +

              If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

              +

              For example:

              +
              cp -r grafana/plugins ../grafana-6.7.3/public/app
              +
              +
              +
                +
              1. Provision the Dashboard them

              2. +
              +

              For example Scylla version 4.0 and Scylla manager version 2.0

              +

              For Grafana installed with yum install

              +
              sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
              +sudo mkdir -p /var/lib/grafana/dashboards
              +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
              +
              +
              +

              For Grafana installed from packages

              +
              cp -p -r grafana/build/* ../grafana-6.7.3/public/build/
              +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml
              +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml
              +
              +
              +

              Edit the load.* files in /home/centos/grafana-6.7.3/conf/provisioning/dashboards/ for the correct path, +for example load.4.0.yaml would point to: /home/centos/grafana-6.7.3/public/build/ver_4.0 and the FOLDER will be 4.0

              +
                +
              1. Set the data source by copy datasource.yml and edit it

              2. +
              +
              sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
              +
              +
              +

              For Grafana installed from packages

              +
              cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/
              +
              +
              +

              You should set the Prometheus and the alertmanager IP and port.

              +

              For example

              +
              sudo cat /etc/grafana/provisioning/datasources/datasource.yml
              +apiVersion: 1
              +datasources:
              + - name: prometheus
              +   type: prometheus
              +   url: http://192.168.135.167:9090
              +   access: proxy
              +   basicAuth: false
              +
              + - name: alertmanager
              +   type: camptocamp-prometheus-alertmanager-datasource
              +   orgId: 1
              +   typeLogoUrl: public/img/icn-datasource.svg
              +   access: proxy
              +   url: http://192.168.135.166:9093
              +   password:
              +   user:
              +   database:
              +   basicAuth:
              +   isDefault:
              +   jsonData:
              +     severity_critical: '4'
              +     severity_high: '3'
              +     severity_warning: '2'
              +     severity_info: '1'
              +
              +
              +
                +
              1. Start the Grafana service

              2. +
              +

              For Grafana installed with yum install

              +

              sudo service grafana-server start

              +

              For Grafana installed from packages:

              +

              cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini

              +

              Edit scylla.ini to reflect the right paths in the paths section of the file.

              +
              plugins = /home/centos/grafana-6.7.3/data/plugins
              +provisioning = /home/centos/grafana-6.7.3/conf/provisioning
              +
              +
              +

              Start the server:

              +
              cd /home/centos/grafana-6.7.3/
              +./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini
              +
              +
              +
                +
              1. Make sure Grafana is running

              2. +
              +

              Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

              +../_images/grafana.png +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/monitoring_stack.html b/branch-3.7/install/monitoring_stack.html new file mode 100644 index 000000000..6f395121f --- /dev/null +++ b/branch-3.7/install/monitoring_stack.html @@ -0,0 +1,1028 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Install Scylla Monitoring Stack

              + +

              This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API.

              +

              The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

              +

              For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

              +
              +

              Minimal Production System Recommendations

              +
                +
              • CPU - at least 2 physical cores/ 4vCPUs

              • +
              • Memory - 15GB+ DRAM

              • +
              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

              • +
              • Network - 1GbE/10GbE preferred

              • +
              +
              +

              Calculating Prometheus Minimal Disk Space requirement

              +

              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

              +

              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

              +

              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

              +
              6 * 16 * 200MB ~ 20GB
              +
              +
              +

              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

              +
              +
              +
              +

              Prerequisites

              +
                +
              • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker .

              • +
              • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

              • +
              + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
              Scylla Monitoring Stack Compatibility Matrix

              Scylla Monitoring Stack Version

              Prometheus Version

              Grafana Version

              3.7

              2.25.2

              7.4.0

              3.6

              2.18.1

              7.3.5

              3.5

              2.18.1

              7.1.5

              3.4

              2.18.1

              6.7.3

              +
              +
              +

              Docker Post Installation

              +

              Docker post installation guide can be found here

              +
              +

              Note

              +

              Avoid running the container as root.

              +
              +

              To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

              +
                +
              1. Create the Docker group.

              2. +
              +
              sudo groupadd docker
              +
              +
              +
                +
              1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

              2. +
              +
              sudo usermod -aG docker $USER
              +
              +
              +
                +
              1. Start Docker by calling:

              2. +
              +
              sudo systemctl enable docker
              +
              +
              +
              +
              +

              Install Scylla Monitoring Stack

              +

              Procedure

              +
                +
              1. Download and extract the latest Scylla Monitoring Stack binary;.

              2. +
              +
              wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.7.0.tar.gz
              +tar -xvf scylla-monitoring-3.7.0.tar.gz
              +cd scylla-monitoring-scylla-monitoring-3.7.0
              +
              +
              +

              As an alternative, you can clone and use the Git repository directly.

              +
              git clone https://github.com/scylladb/scylla-monitoring.git
              +cd scylla-monitoring
              +git checkout branch-3.7
              +
              +
              +
                +
              1. Start Docker service if needed

              2. +
              +
              sudo systemctl restart docker
              +
              +
              +
              +
              +

              Configure Scylla Monitoring Stack

              +

              To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

              +

              This configuration can be done from files, or using the Consul api.

              +

              Scylla Manager 2.0 and higher supports the Consul API.

              +
              +

              Configure Scylla nodes from files

              +
                +
              1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

              2. +
              +
              +

              Note

              +

              It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

              +
              +

              For example:

              +
              - targets:
              +      - 172.17.0.2
              +      - 172.17.0.3
              +  labels:
              +      cluster: cluster1
              +      dc: dc1
              +
              +
              +
              +

              Note

              +

              If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

              +
              +

              Using IPV6

              +

              To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

              +

              For example:

              +
              - targets:
              +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
              +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
              +  labels:
              +      cluster: cluster1
              +      dc: dc1
              +
              +
              +
              +

              Note

              +

              For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

              +
              +

              For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

              +
              +

              Note

              +

              By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

              +
              +

              If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

              +

              For example:

              +
              ./start-all.sh -s my_scylla_server.yml -d prometheus_data
              +
              +
              +

              Mark the different Data Centers with Labels.

              +

              As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

              +

              You can use the genconfig.py script to generate the server file. For example:

              +
              ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
              +
              +
              +

              This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

              +

              OR

              +

              The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

              +
              nodetool status | ./genconfig.py -NS
              +
              +
              +

              2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

              +

              You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

              +

              For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

              +
              # List Scylla Manager end points
              +
              +- targets:
              +  - 172.17.0.7:5090
              +
              +
              +

              Note that you do not need to add labels to the Scylla Manager targets.

              +
              +
              +

              Configure Scylla nodes using Scylla-Manager Consul API

              +

              Scylla Manager 2.0 has a Consul like API.

              +

              When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

              +

              For example:

              +
              ./start-all.sh -L 10.10.0.1
              +
              +
              +
              +

              Note

              +

              If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

              +
              +
              +
              +

              Connecting Scylla-Monitoring to Scylla

              +

              Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

              +

              You can limit the user to read only, currently it only read table from the system keyspace.

              +

              To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

              +

              Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

              +
              +
              +

              Use an external directory for the Prometheus data directory

              +

              The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

              +
              +

              Note

              +

              Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

              +
              +

              If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

              +

              In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

              +
              +
              +

              Add Additional Prometheus Targets

              +

              There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

              +

              The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

              +

              You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

              +
              - job_name: 'myservice'
              +  # Override the global default and scrape targets from this job every 5 seconds.
              +  scrape_interval: 5s
              +  static_configs:
              +    - targets:
              +      - 17.0.0.1:7000
              +
              +
              +
              +
              +
              +

              Start and Stop Scylla Monitoring Stack

              +
              +

              Start

              +
              ./start-all.sh -d prometheus_data
              +
              +
              +
              +
              +

              Stop

              +
              ./kill-all.sh
              +
              +
              +
              +
              +

              Start a Specific Scylla Monitoring Stack Version

              +

              By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

              +

              You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

              +

              Multiple versions are supported. For example:

              +
              ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
              +
              +
              +

              will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

              +
              +
              +

              Accessing the localhost

              +

              The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

              +
              ./start-all.sh -l -d prometheus-data
              +
              +
              +
              +
              +

              Configure rsyslog on each Scylla node

              +

              generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

              +

              Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

              +

              Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

              +

              If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

              +
              if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
              +
              +
              +

              Restart rsyslog for the configuration to take effect.

              +
              systemctl restart rsyslog
              +
              +
              +
              +
              +
              +

              View Grafana Dashboards

              +

              Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/start_all.html b/branch-3.7/install/start_all.html new file mode 100644 index 000000000..1741f6558 --- /dev/null +++ b/branch-3.7/install/start_all.html @@ -0,0 +1,744 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              The start-all.sh command

              +

              Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

              +

              The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

              +
              +

              General Options

              +

              -h Help, Print the help, and exit.

              +

              –version print the current Scylla-Monitoring stack version, and exit.

              +

              -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

              +

              -A bind-to-ip-address Bind the listening-address to an explicit IP address.

              +

              -D encapsulate docker param Allows passing additional parameters to all the docker containers.

              +

              –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

              +
              + + +
              +

              Alert Manager

              +

              alertmanager handles the alerts and takes the following parameters:

              +

              -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

              +

              -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

              +

              -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/thanos.html b/branch-3.7/install/thanos.html new file mode 100644 index 000000000..304181fa7 --- /dev/null +++ b/branch-3.7/install/thanos.html @@ -0,0 +1,747 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Using Thanos as Data Source With Scylla Monitoring Stack

              +

              Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as:

              +
                +
              • High-availability.

              • +
              • Horizontal scaling.

              • +
              • Backup.

              • +
              +

              The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

              +

              The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

              +
              +

              Using Thanos As a Prometheus Aggregator

              +

              There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

              +
              +

              Prometheus Configuration

              +

              We will assume you have two Prometheus servers running.

              +
                +
              1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

              2. +
              3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

              4. +
              +
              +
              +

              Thanos sidecar

              +

              The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

              +
              docker run -d \
              + -v /path/to/prom/dir:/data/prom:z \
              + -i --name sidecar thanosio/thanos \
              + sidecar \
              + --grpc-address=0.0.0.0:10911 \
              + --grpc-grace-period=1s \
              + --http-address=0.0.0.0:10912 \
              + --http-grace-period=1s \
              + --prometheus.url=http://prometheus-ip:9090 \
              + --tsdb.path=/data/prom \
              + -p 10912:10912 \
              + -p 10911:10911
              +
              +
              +

              After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

              +
              +
              +

              Thanos query

              +

              Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

              +
              docker run -d \
              + --name thanos -- thanosio/thanos \
              +   query \
              +   --debug.name=query0 \
              +   --log.level=debug \
              +   --grpc-address=0.0.0.0:10903 \
              +   --grpc-grace-period=1s \
              +   --http-address=0.0.0.0:10904 \
              +   --http-grace-period=1s \
              +   --query.replica-label=prometheus \
              +   --store={ip1}:10911 --store={ip2}:10911
              +
              +
              +

              After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

              +
              +
              +

              Update Scylla Data source

              +

              The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

              +

              The file you edit is a template file that replaces the file Grafana uses, next time you start.

              +

              Restart the Scylla Monitoring Stack it should now use Thanos.

              +
              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/objects.inv b/branch-3.7/objects.inv new file mode 100644 index 000000000..e511733e8 Binary files /dev/null and b/branch-3.7/objects.inv differ diff --git a/branch-3.7/procedures/alerts/alerting.html b/branch-3.7/procedures/alerts/alerting.html new file mode 100644 index 000000000..8f13b85ad --- /dev/null +++ b/branch-3.7/procedures/alerts/alerting.html @@ -0,0 +1,743 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Alerting

              +

              Alerts are a Prometheus enhancement to notify that something is wrong in the system.

              +

              You can read more about Prometheus alerting here

              +

              By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

              +

              In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

              +

              The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

              +../../_images/monitoring_stack.png +
              +

              Prometheus Alerts

              +

              The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

              +

              Each alert consists of:

              +
                +
              • Name

              • +
              • What happened

              • +
              • For how long

              • +
              • What to report

              • +
              +

              For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

              +
              - alert: InstanceDown
              +  expr: up == 0
              +  for: 60s
              +  labels:
              +    severity: "2"
              +  annotations:
              +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
              +    summary: Instance {{ $labels.instance }} down
              +
              +
              +

              The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

              +

              The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

              +

              The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

              +

              annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

              +
              +
              +

              Alertmanager

              +

              The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

              +

              The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

              +
                +
              • Routes: Represent a routing tree, the most specific rule, wins

              • +
              • Inhibition: Mute an alert, based on another alert

              • +
              • Receiver: Send a notification via email, sluck, etc’

              • +
              +

              Check the Alertmanager documentation for details on how to specify a specific receiver.

              +

              In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

              +
              +
              +

              Tips When Adding an Alert

              +

              It’s worse having an alert that does not work, than not having an alert at all

              +

              There are multiple ways you can use to make sure your alert is set correctly:

              +
                +
              • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

              • +
              • Force the alert to be active by reducing the limits or the duration.

              • +
              • When possible simulate the actual scenario and see that the alert works as expected.

              • +
              +

              For example, low available disk space.

              +

              Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

              +

              Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

              +

              Starting with a simple working expression helps you bisect problems.

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/procedures/alerts/index.html b/branch-3.7/procedures/alerts/index.html new file mode 100644 index 000000000..340ab4e67 --- /dev/null +++ b/branch-3.7/procedures/alerts/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Alert Manager

              +
              +
              +

              Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/procedures/index.html b/branch-3.7/procedures/index.html new file mode 100644 index 000000000..d43ff2c9a --- /dev/null +++ b/branch-3.7/procedures/index.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Procedures

              +
              +
              +

              There are several reference guides available which give additional information. Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/procedures/updating_dashboard.html b/branch-3.7/procedures/updating_dashboard.html new file mode 100644 index 000000000..6a6597554 --- /dev/null +++ b/branch-3.7/procedures/updating_dashboard.html @@ -0,0 +1,953 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Adding and Modifying Dashboards

              +

              The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

              +

              It will explain about Scylla Monitoring Stack dashboard templates and how to modify them.

              + +
              +

              General Limitations

              +

              Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades.

              +
              +

              consistency between restarts

              +

              By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana.

              +
              +
              +

              consistency between upgrades

              +

              As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

              +
              +

              Note

              +

               You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided.

              +
              +

              At large, we suggest maintaining your dashboards as files, as Scylla Monitor does.

              +
              +
              +
              +

              Using templated Dashboards

              +

              Why does Scylla Monitor use dashboard templates?

              +

              We found the Grafana dashboards Json format too verbose to be maintainable.

              +

              Each element in the dashboard file (Each Json object) contains all of its attributes and values.

              +

              For example a typical graph panel would look like:

              +
              {
              +    "aliasColors": {},
              +    "bars": false,
              +    "datasource": "prometheus",
              +    "editable": true,
              +    "error": false,
              +    "fill": 0,
              +    "grid": {
              +        "threshold1": null,
              +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
              +        "threshold2": null,
              +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
              +    },
              +    "gridPos": {
              +        "h": 6,
              +        "w": 10,
              +        "x": 0,
              +        "y": 4
              +    },
              +    "id": 2,
              +    "isNew": true,
              +    "legend": {
              +        "avg": false,
              +        "current": false,
              +        "max": false,
              +        "min": false,
              +        "show": false,
              +        "total": false,
              +        "values": false
              +    },
              +    "lines": true,
              +    "linewidth": 2,
              +    "links": [],
              +    "nullPointMode": "connected",
              +    "percentage": false,
              +    "pointradius": 5,
              +    "points": false,
              +    "renderer": "flot",
              +    "seriesOverrides": [
              +        {}
              +    ],
              +    "span": 5,
              +    "stack": false,
              +    "steppedLine": false,
              +    "targets": [
              +        {
              +            "expr": "sum(node_filesystem_avail) by (instance)",
              +            "intervalFactor": 1,
              +            "legendFormat": "",
              +            "refId": "A",
              +            "step": 1
              +        }
              +    ],
              +    "timeFrom": null,
              +    "timeShift": null,
              +    "title": "Available Disk Size",
              +    "tooltip": {
              +        "msResolution": false,
              +        "shared": true,
              +        "sort": 0,
              +        "value_type": "cumulative"
              +    },
              +    "transparent": false,
              +    "type": "graph",
              +    "xaxis": {
              +        "show": true
              +    },
              +    "yaxes": [
              +        {
              +            "format": "percent",
              +            "logBase": 1,
              +            "max": 101,
              +            "min": 0,
              +            "show": true
              +        },
              +        {
              +            "format": "short",
              +            "logBase": 1,
              +            "max": null,
              +            "min": null,
              +            "show": true
              +        }
              +    ]
              +}
              +
              +
              +

              As you can imagine, most panels would have similar values.

              +

              To reduce the redundancy of Grafana JSON format, we added dashboard templates.

              +
              +

              The template class system

              +

              Scylla Monitoring Stack dashboard templates use class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

              +

              The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes.

              +

              In the template file, you can also add or override attributes.

              +

              The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

              +

              When generating dashboards, each class will be replaced by its definition.

              +

              For example row in the type.json defined

              +
              {
              + "base_row": {
              +     "collapse": false,
              +     "editable": true
              + },
              + "row": {
              +     "class": "base_row",
              +     "height": "250px"
              + }
              + }
              +
              +
              +

              In a Template it will be used like

              +
              {
              +     "class": "row",
              +     "height": "150px",
              +     "panels": [
              +     ]
              +}
              +
              +
              +

              The output will be

              +
              {
              +     "class": "row",
              +     "collapse": false,
              +     "editable": true,
              +     "height": "150px",
              +     "panels": [
              +
              +     ]
              +}
              +
              +
              +

              We can see that the template added the panels attribute and override the height attribute.

              +
              +
              +

              Panel example

              +

              Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

              +
              {
              +     "class": "row",
              +     "panels": [
              +         {
              +             "class": "bytes_panel",
              +             "span": 3,
              +             "targets": [
              +                 {
              +                     "expr": "sum(node_filesystem_avail) by (instance)",
              +                     "intervalFactor": 1,
              +                     "legendFormat": "",
              +                     "metric": "",
              +                     "refId": "A",
              +                     "step": 1
              +                 }
              +             ],
              +             "title": "Available Disk Size"
              +         }
              +     ]
              +}
              +
              +
              +

              In the example, we used the bytes_panel class that generate a graph with bytes as units (that would mean that your +Y axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’)

              +

              You can also see that we override the span attribute to set the panel size.

              +

              To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

              +
              +
              +

              Grafana Formats and Layouts

              +

              The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

              +

              Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width).

              +

              The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

              +

              To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

              +

              The panel’s height will be taken from their row. The span attribute is still supported as is row height.

              +

              you can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

              +

              gridPos has the following attributes:

              +
              {
              +   "x": 0,
              +   "y": 0,
              +   "w": 24,
              +   "h": 4
              + }
              +
              +
              +

              When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

              +
              {
              +   "gridPos": {
              +      "h": 2
              +    }
              +}
              +
              +
              +
              +
              +

              Generating the dashboards from templates (generate-dashboards.sh)

              +
              +

              Prerequisite

              +

              Python 2.7

              +

              make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

              +

              Use the -h flag to get help information.

              +

              You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

              +

              When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

              +

              For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

              +

              .\generate-dashboards.sh -v 2020.1

              +
              +

              Note

              +

              generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard.

              +
              +
              +
              +
              +

              Validation

              +

              After making changes to a template, run the generate_generate-dashboards.sh you should see that it run without any errors.

              +

              Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

              +
              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/reference/index.html b/branch-3.7/reference/index.html new file mode 100644 index 000000000..f1e3e269c --- /dev/null +++ b/branch-3.7/reference/index.html @@ -0,0 +1,659 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Reference Guide

              +
              +
              +

              There are several reference guides available which give additional information. Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/reference/matrix.html b/branch-3.7/reference/matrix.html new file mode 100644 index 000000000..87b75c57d --- /dev/null +++ b/branch-3.7/reference/matrix.html @@ -0,0 +1,776 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Support Matrix

              +

              The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

              + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

              Scylla Monitoring Stack Version

              Scylla Open Source Version

              Scylla Enterprise Version

              Node_exporter[1] Version

              Scylla Manager Version

              3.7

              4.2, 4.3, 4.4

              2019.1, 2020.1, 2021.1

              0.17

              2.2, 2.3

              3.6.3

              4.2, 4.3, 4.4

              2019.1, 2020.1, 2021.1

              0.17

              2.2, 2.3, 2.1

              3.6

              4.1, 4.2, 4.3

              2019.1, 2020.1

              0.17

              2.1, 2.2, 2.3

              3.6.1

              4.1, 4.2, 4.3

              2019.1, 2020.1

              0.17

              2.1, 2.2

              3.6.1

              4.1, 4.2, 4.3, 4.4

              2019.1, 2020.1

              0.17

              2.1, 2.2

              3.5

              3.3, 4.0, 4.1, 4.2

              2019.1, 2020.1

              0.17

              2.0, 2.1, 2.2

              3.4.3

              3.3, 4.0, 4.1, 4.2

              2019.1, 2020.1

              0.17

              2.0, 2.1

              3.4

              3.3, 4.0, 4.1

              2018.1, 2019.1

              0.17

              2.0, 2.1

              3.3

              3.1, 3.2, 3.3, 4.0

              2018.1, 2019.1

              0.17

              1.4, 2.0, 2.1

              3.2

              3.1, 3.2, 3.3

              2018.1, 2019.1

              0.17

              1.4, 2.0

              3.1

              2.3, 3.0, 3.1, 3.2

              2018.1, 2019.1

              0.17

              1.3, 1.4, 2.0

              3.0

              2.3, 3.0, 3.1, 3.2

              2018.1, 2019.1

              0.17

              1.3, 1.4

              2.4

              2.3, 3.0, 3.1

              2018.1, 2019.1

              0.14, 0.17

              1.3, 1.4

              2.3

              2.3, 3.0

              2018.1, 2019.1

              0.14, 0.17

              1.3

              2.2

              2.3, 3.0

              2018.1, 2019.1

              0.14, 0.17

              1.3

              2.1

              2.3, 3.0

              2018.1

              0.14, 0.17

              1.3

              +

              [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/reference/monitoring_apis.html b/branch-3.7/reference/monitoring_apis.html new file mode 100644 index 000000000..e3701223d --- /dev/null +++ b/branch-3.7/reference/monitoring_apis.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Interfaces

              +

              Scylla exposes two interfaces for online monitoring, as described below

              +
              +

              Prometheus

              +

              By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

              +

              For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack

              +

              You can change the Prometheus listening address and port in scylla.yaml file

              +
              # prometheus port
              +# By default, Scylla opens prometheus API port on port 9180
              +# setting the port to 0 will disable the prometheus API.
              +prometheus_port: 9180
              +#
              +# prometheus address
              +# By default, Scylla binds all interfaces to the prometheus API
              +# It is possible to restrict the listening address to a specific one
              +prometheus_address: 0.0.0.0
              +
              +
              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/robots.txt b/branch-3.7/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.7/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.7/search.html b/branch-3.7/search.html new file mode 100644 index 000000000..c5e838c53 --- /dev/null +++ b/branch-3.7/search.html @@ -0,0 +1,639 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + + + +
              + + + + + +
              + + +
              + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/searchindex.js b/branch-3.7/searchindex.js new file mode 100644 index 000000000..b67193cc7 --- /dev/null +++ b/branch-3.7/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "Scylla Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], "7": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], "scylla": [0, 2, 4, 7, 9, 12, 18, 19, 21, 22, 24, 29, 30], "monitor": [0, 2, 4, 7, 9, 12, 30], "stack": [0, 2, 7, 12, 30], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 17, 18, 19, 20, 21, 24, 25, 26, 28, 30], "full": [0, 1, 3, 6, 9, 18], "alert": [0, 1, 3, 5, 6, 11], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 14, 17, 26, 28], "contain": [0, 1, 2, 3, 6, 7, 8, 12, 21, 30], "open": [0, 1, 3, 5, 6, 14, 15], "sourc": [0, 1, 3, 5, 6, 9, 14], "tool": [0, 1, 3, 17, 30], "includ": [0, 1, 3, 5], "prometheu": [0, 1, 3, 10, 12, 14, 17, 30], "grafana": [0, 1, 3, 8, 9], "well": [0, 1, 3, 6], "custom": [0, 1, 3], "dashboard": [0, 1, 3, 5, 7, 9, 11, 14, 17, 25, 30, 31], "consist": [1, 9, 25], "three": [1, 6, 9], "compon": 1, "wrap": 1, "docker": [1, 3, 7, 8, 17], "collect": [1, 6, 7, 8, 26, 28], "store": [1, 5, 8, 12, 19, 20], "metric": [1, 4, 5, 6, 7, 8, 9, 12, 14, 30], "alertmanag": [1, 2, 7], "handl": [1, 6, 7], "server": [1, 2, 5, 6, 7, 8, 9, 12, 15, 18, 30], "choos": [1, 3, 10, 11, 13, 16, 17, 31], "topic": [1, 3, 10, 11, 13, 16, 20, 31], "get": [1, 6, 8, 9, 12, 19, 25, 29, 30], "start": [1, 3, 5, 8, 9, 12], "user": [1, 2, 5, 6, 7, 18, 30], "guid": [1, 6, 11, 17], "download": [1, 5, 6], "instal": [1, 2, 17], "procedur": [1, 5, 6, 17], "troubleshoot": [1, 24], "refer": [1, 6, 11], "lesson": [1, 20, 21], "univers": 1, "For": [1, 2, 4, 5, 6, 7, 9, 12, 15, 17, 25, 26, 29, 30], "older": 1, "version": [1, 2, 5, 7, 12, 14, 17], "document": [1, 6, 8, 9, 12, 17], "see": [1, 2, 4, 5, 6, 9, 12, 15, 17, 30], "here": [1, 5, 6, 7, 9, 12], "base": [2, 5, 6, 7, 8, 9, 12, 18, 30], "you": [2, 4, 5, 6, 7, 8, 9, 10, 12, 15, 17, 21, 23, 25, 30, 31], "can": [2, 5, 6, 7, 8, 9, 12, 15, 17, 18, 21, 25, 30, 31], "all": [2, 3, 6, 8, 9, 12, 15, 17, 18, 22, 25, 30], "sh": [2, 3, 6, 17], "kill": [2, 6, 17], "script": [2, 3, 6, 7, 12], "an": [2, 4, 5, 7, 8, 12, 17, 23, 24, 25, 26, 28, 30], "altern": [2, 6], "method": [2, 6], "It": [2, 6, 7, 9, 12, 15], "requir": [2, 8, 19, 22, 26, 30], "more": [2, 6, 9, 12, 15, 17, 18, 21, 24, 26, 29, 30], "manual": [2, 17], "step": [2, 5, 8, 12, 17], "onc": [2, 23, 30], "configur": [2, 5, 7, 9, 12, 15, 17, 25], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 17, 25, 26, 27, 30, 31], "two": [2, 6, 7, 8, 15, 25, 30], "wai": [2, 7, 9, 17, 24, 30], "launch": 2, "should": [2, 5, 6, 8, 12, 17, 18, 19, 22, 23, 24, 29, 30], "one": [2, 6, 7, 15, 19, 21, 22, 25, 26, 30], "both": [2, 5, 6, 17, 30], "In": [2, 6, 9, 12, 17, 30], "particular": 2, "creat": [2, 5, 6, 7, 9, 12, 17, 18, 30], "updat": [2, 5, 12, 17], "yml": [2, 5, 6, 7, 8, 9, 17, 30], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 17, 20, 25, 26, 30], "make": [2, 5, 6, 7, 8, 9, 12, 17, 25, 30], "sure": [2, 5, 6, 8, 9, 12, 17, 30], "have": [2, 4, 5, 6, 7, 8, 9, 12, 17], "among": [2, 25], "other": [2, 8, 9], "ip": [2, 5, 6, 7, 8, 15, 17], "address": [2, 5, 6, 7, 8, 15, 17], "either": [2, 6], "locat": [2, 7, 9, 25], "scylla_serv": [2, 5, 6, 17, 30], "consul": [2, 7], "manag": [2, 5, 11, 14, 16], "config": [2, 5, 7], "gener": [2, 6, 9, 30], "exampl": [2, 4, 5, 6, 7, 8, 9, 17, 25, 26, 30], "product": [2, 7], "system": [2, 7, 9, 10, 19, 25, 30], "advis": [2, 25], "extern": [2, 5, 7, 8, 9, 12, 17, 30], "directori": [2, 5, 7, 8, 9, 12], "databas": [2, 5, 7, 21, 30], "accordingli": 2, "below": [2, 6, 9, 15], "read": [2, 6, 8, 9, 17, 18, 22], "its": [2, 6, 7, 8, 12], "from": [2, 5, 7, 8, 9, 17, 18, 24, 27, 30], "note": [2, 5, 6, 7, 17], "latter": 2, "tell": 2, "where": [2, 5, 6, 12, 17, 30], "themselv": [2, 12], "which": [2, 8, 11, 12, 13, 14, 24, 26, 28, 30], "differ": [2, 5, 6, 7, 8, 12, 23, 24, 30], "run": [2, 3, 5, 6, 7, 8, 12, 14, 17], "follow": [2, 4, 5, 6, 7, 12, 14, 17, 30], "command": [2, 6, 8, 17], "datasourc": [2, 5, 6, 8, 12], "under": [2, 5, 6], "yaml": [2, 5, 6, 15], "To": [2, 4, 5, 6, 12, 15], "sashboard": 2, "t": [2, 12], "line": [2, 6, 7, 8, 12], "flag": [2, 6, 7, 8, 12, 17], "v": [2, 6, 7, 8, 12, 17], "specifi": [2, 6, 7, 9, 12, 17], "enterpris": [2, 6, 12, 14], "2020": [2, 6, 12, 14], "1": [2, 5, 6, 7, 8, 12, 14], "thi": [2, 4, 5, 6, 7, 8, 9, 12, 17, 18, 19, 22, 25, 27, 30], "your": [2, 5, 6, 7, 8, 9, 10, 12, 15, 17, 19, 20, 21, 30], "pass": [2, 6, 7], "call": [2, 6, 7], "servic": [2, 5, 6, 7, 17], "container_nam": 2, "aalert": 2, "imag": [2, 17], "prom": [2, 8, 17], "v0": [2, 5], "21": 2, "port": [2, 5, 6, 7, 15, 17], "9093": [2, 5], "volum": [2, 4, 5, 6], "rule_config": [2, 5, 7, 9], "etc": [2, 5, 6, 7, 9, 12], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 12], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "scylladb": [2, 5, 6, 20, 21, 22, 24, 26, 28, 29], "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 12], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "5": [2, 4, 5, 6, 12, 14, 17], "3000": [2, 5, 6], "1000": 2, "build": [2, 5], "plugin": [2, 5], "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 20, 26, 28, 30], "path": [2, 5, 6, 7, 8, 9], "dir": [2, 7, 8], "loki": [2, 6], "mnt": 2, "2": [2, 4, 5, 6, 7, 9, 12, 14, 26], "3100": 2, "rule": [2, 5, 7, 9, 23], "conf": [2, 5, 6], "promotheu": 2, "aprom": [2, 17], "v2": [2, 5], "18": [2, 5, 6], "9090": [2, 5, 8, 17], "d": [2, 6, 7, 8], "scylla_manager_serv": [2, 5, 6, 17], "node_exporter_serv": [2, 5, 6], "promtail": 2, "1514": [2, 6], "9080": 2, "promtail_config": 2, "up": [2, 5, 9, 17, 30], "down": [2, 9, 17, 19, 26], "begin": [3, 5, 10, 11, 13, 16, 31], "deploi": [3, 6], "without": [3, 6, 7, 12], "us": [3, 4, 5, 7, 9, 10, 17, 21, 25, 26, 28, 30], "compos": 3, "thano": 3, "cpu": [4, 5, 6], "least": [4, 5, 6], "physic": [4, 5, 6], "core": [4, 5, 6], "4vcpu": [4, 5, 6], "memori": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "storag": [4, 5, 6, 7, 12], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 26], "retent": [4, 5, 6], "period": [4, 5, 6, 8, 9], "section": [4, 5, 6, 17, 30], "network": [4, 5, 6, 7, 17], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 17], "perform": [4, 5, 6, 25, 29, 30], "block": [4, 5, 6], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 9, 21, 26, 28, 30], "default": [4, 5, 6, 7, 9, 12, 15, 17, 22, 30], "15": [4, 5, 6], "dai": [4, 5, 6, 7], "around": [4, 5, 6, 17], "200mb": [4, 5, 6], "per": [4, 5, 6, 8, 30], "assum": [4, 5, 6, 7, 8, 9], "scrape": [4, 5, 6], "interv": [4, 5, 6], "6": [4, 5, 6, 12, 14], "node": [4, 5, 7, 14, 17, 19, 20, 21, 25, 26, 28, 29, 30], "cluster": [4, 5, 6, 24, 30], "each": [4, 5, 7, 8, 9, 12, 14, 17, 19, 21, 25, 30], "16": [4, 5, 6, 17], "time": [4, 5, 6, 7, 8, 9, 23, 30], "need": [4, 5, 6, 7, 8, 12, 17, 19, 20, 21, 30], "20gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 12, 17, 27, 30], "replac": [4, 5, 6, 8, 12], "ad": [4, 5, 6, 7, 11], "we": [4, 5, 6, 8, 12, 30], "alloc": [4, 5, 6], "x4": [4, 5, 6], "case": [4, 5, 6, 7, 8, 9, 12, 17, 19, 30], "100gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 9, 12, 17, 30], "fast": [4, 5, 6], "enough": [4, 5, 6], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 9, 12, 17, 19, 25, 30], "out": [4, 5, 6, 8], "box": [4, 5, 6, 8], "instruct": [5, 6], "help": [5, 7, 9, 12, 30], "pleas": [5, 17], "most": [5, 9, 12, 25, 27, 30], "current": [5, 6, 7, 9, 12, 17], "main": 5, "item": 5, "set": [5, 6, 7, 9, 12, 15], "avail": [5, 6, 8, 9, 11, 12, 13, 19, 20, 30], "data": [5, 7, 9, 12, 18, 19, 20, 21, 25, 26, 28, 29, 30], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 17], "befor": [5, 6, 9, 19, 20, 26, 30], "support": [5, 6, 12, 13, 18, 24, 30], "want": [5, 6, 9], "compat": [5, 12, 17], "matrix": [5, 13], "cento": [5, 17], "instanc": [5, 6, 9, 12], "latest": [5, 6, 7], "releas": 5, "wget": [5, 6], "http": [5, 6, 8, 17, 20, 21, 22, 24, 29], "github": [5, 6], "com": [5, 6, 20, 21, 22, 24, 29], "archiv": [5, 6], "tar": [5, 6], "gz": [5, 6], "xvf": [5, 6], "test": [5, 17, 30], "20": [5, 29], "linux": 5, "amd64": 5, "copi": 5, "file": [5, 7, 8, 9, 12, 15], "cp": 5, "p": [5, 7, 8, 17], "home": 5, "cd": [5, 6], "verifi": 5, "point": [5, 6, 12], "browser": [5, 6, 8, 12, 17], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "templat": [5, 6, 8, 17, 30], "edit": [5, 6, 7, 8, 12, 17], "correct": 5, "static": 5, "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 24], "host": [5, 6, 7, 17], "static_config": [5, 6], "target": [5, 7, 12, 15, 17], "127": [5, 7, 17], "right": [5, 6, 12, 25, 30], "local": [5, 6, 7, 8, 12, 17, 30], "typic": [5, 12, 19, 21, 30], "node_export": [5, 6, 7, 14, 17], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 9, 12, 15, 22, 30], "everi": [5, 6, 7], "second": [5, 6, 9, 17], "scrape_timeout": 5, "4": [5, 6, 12, 14], "timeout": 5, "try": [5, 17], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 9], "ani": [5, 6, 9, 12, 17, 25, 30], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": 5, "scrape_config": 5, "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 15, 17], "There": [5, 6, 8, 9, 11, 12, 13, 29, 31], "instead": [5, 6, 8, 30], "those": 5, "found": [5, 6, 7, 9, 12], "must": [5, 6, 26], "even": [5, 6, 7], "add": [5, 7, 8, 9, 12, 15, 30], "center": [5, 6, 8, 30], "cat": 5, "list": [5, 6], "end": [5, 6, 30], "66": [5, 17], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8], "dc1": [5, 6], "172": [5, 6, 17], "17": [5, 6, 14, 17], "dc2": [5, 6], "previou": 5, "about": [5, 9, 12, 25], "deprec": 5, "56090": [5, 17], "mkdir": 5, "mydata": 5, "tsdb": [5, 7, 8], "accumul": 5, "consol": [5, 17], "visibl": 5, "execut": [5, 18, 23], "queri": [5, 25, 26, 28], "through": 5, "node_memory_memfre": 5, "And": 5, "scylla_reactor_util": 5, "At": [5, 12], "emit": 5, "abl": [5, 8], "them": [5, 7, 9, 12, 25], "grafna": 5, "higher": [5, 6, 21, 30], "depend": [5, 8], "repositori": [5, 6], "yum": 5, "zip": 5, "structur": 5, "rest": [5, 8], "access": [5, 7], "sudo": [5, 6, 17], "r": [5, 7, 12, 17], "If": [5, 6, 7, 8, 12, 17, 27, 29, 30], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 12, 17], "provis": [5, 6, 12], "load": [5, 6, 17, 18, 21, 22, 30], "manager_2": 5, "would": [5, 6, 8, 9, 12, 18, 21, 30], "ver_4": 5, "folder": 5, "apivers": 5, "name": [5, 6, 8, 9, 17, 30], "type": [5, 12, 30], "url": [5, 8], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "describ": [6, 8, 15, 17, 30], "setup": 6, "dedic": 6, "so": [6, 7, 8, 9, 12, 17, 21, 30], "pull": [6, 17], "over": 6, "evalu": 6, "laptop": 6, "tabl": [6, 9, 14, 18, 25, 30], "25": [6, 17], "avoid": [6, 12, 17, 22, 24, 30], "root": [6, 17], "go": [6, 17], "group": [6, 9], "groupadd": 6, "log": [6, 8, 17], "new": [6, 17], "activ": [6, 9], "next": [6, 7, 8], "login": [6, 17], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 17], "extract": 6, "binari": [6, 17], "As": [6, 12, 23], "clone": 6, "git": 6, "directli": 6, "checkout": 6, "branch": 6, "restart": [6, 7, 8], "know": [6, 17, 21, 30], "done": [6, 7, 12, 17], "wish": [6, 7], "import": [6, 7], "match": [6, 30], "datacent": 6, "nodetool": 6, "statu": [6, 17], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "work": [6, 7, 8, 9, 12], "": [6, 7, 9, 12, 18, 19, 27, 30], "web": [6, 8], "listen": [6, 7, 15], "inform": [6, 7, 11, 12, 13, 15, 18, 19, 20], "agent": [6, 7, 8, 14, 17], "machin": [6, 7, 17], "overrid": [6, 7, 12], "n": [6, 7], "own": [6, 7, 17], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "multipl": [6, 7, 8, 9, 12, 19, 22, 23, 29, 30], "genconfig": 6, "py": [6, 12], "myconf": 6, "four": 6, "OR": 6, "also": [6, 7, 8, 9, 12], "look": [6, 8, 9, 12, 30], "5090": [6, 17], "do": [6, 7, 12, 17, 21, 30], "l": [6, 7, 17], "10": [6, 9, 12], "within": [6, 9], "cql": [6, 25, 31], "protect": 6, "author": [6, 7], "assign": 6, "limit": [6, 8, 9, 22, 30], "onli": [6, 7, 21, 23, 30], "keyspac": 6, "securejsondata": 6, "part": [6, 9, 18, 21, 25, 30], "place": [6, 7, 8, 12, 30], "outsid": [6, 7], "result": [6, 7, 19, 21, 22, 30], "lost": [6, 7, 12, 30], "exist": [6, 12, 30], "permiss": 6, "somewher": 6, "els": [6, 7], "situat": [6, 7, 9, 30], "firewal": [6, 17], "7000": [6, 17], "myservic": 6, "job": [6, 17], "m": [6, 7], "2019": [6, 14, 29], "reach": [6, 8, 21, 26, 30], "function": [6, 8], "act": [6, 8, 9], "featur": [6, 8], "direct": 6, "send": [6, 9, 21, 22, 26, 28, 30], "than": [6, 9, 12, 30], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "take": [6, 7, 12, 17], "effect": [6, 12, 17], "authent": [6, 7], "disabl": [6, 15], "option": [6, 8, 17], "simplest": 7, "small": 7, "util": [7, 12], "appropri": 7, "h": [7, 12], "print": 7, "exit": 7, "applic": 7, "localhost": 7, "becaus": [7, 17, 26], "cannot": [7, 26], "map": 7, "A": [7, 8, 12, 19, 20, 26, 30], "bind": [7, 15], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 20, 23, 25], "addit": [7, 9, 11, 13, 30], "auto": 7, "automat": 7, "failur": [7, 17], "g": 7, "gui": [7, 12, 17], "keep": 7, "clear": 7, "comma": 7, "separ": 7, "come": [7, 9], "specif": [7, 9, 15, 17, 27, 30], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "role": 7, "privileg": 7, "That": [7, 9, 12], "mean": [7, 12, 18, 19, 20, 21, 22, 26, 28, 30], "thei": [7, 9, 29], "chang": [7, 12, 15, 17], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 12], "b": 7, "o": [7, 14, 25], "disk": [7, 9, 12, 17, 18, 20, 25], "besid": [7, 30], "relev": [7, 25], "possibl": [7, 9, 15, 24, 30], "api": [7, 8, 15], "resolv": 7, "explicitli": [7, 12], "week": 7, "common": [7, 30], "request": [7, 15, 25], "how": [7, 8, 9, 12, 19, 20, 21, 25, 30], "someth": [7, 9, 10, 12], "opportun": 7, "demonstr": 7, "cover": 7, "30": [7, 9], "30d": 7, "anoth": [7, 9], "arbitrari": 7, "opensourc": 8, "top": 8, "additiuon": 8, "high": [8, 12, 20], "horizont": 8, "scale": 8, "backup": 8, "benefit": [8, 30], "flexibl": 8, "design": 8, "some": [8, 9, 25, 29], "front": 8, "few": 8, "reason": [8, 12, 17, 28, 30], "why": [8, 12], "total": [8, 12], "million": 8, "singl": [8, 12, 25], "capac": 8, "sometim": 8, "traffic": [8, 17, 29, 30], "between": [8, 17, 25, 30], "reachabl": 8, "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 12, 20], "expos": [8, 15], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 25], "10903": 8, "10904": 8, "replica": [8, 19, 20, 21, 25, 26, 30], "connect": [8, 12, 15, 17], "abov": 8, "last": 8, "db_address": 8, "could": [8, 25, 29, 30], "long": [8, 9], "now": [8, 9], "enhanc": [9, 10], "notifi": [9, 10, 25], "wrong": [9, 10, 12, 17, 30], "shown": [9, 17], "overview": [9, 20, 25], "sent": [9, 26, 28], "email": 9, "slack": 9, "condit": 9, "met": 9, "certain": 9, "defin": [9, 12, 24, 30], "what": 9, "happen": [9, 17], "report": [9, 14, 17, 30], "let": 9, "u": 9, "instancedown": 9, "expr": [9, 12], "60": 9, "sever": [9, 11, 13, 31], "annot": 9, "descript": [9, 25], "been": 9, "summari": 9, "legal": 9, "express": 9, "equal": 9, "minim": 9, "durat": 9, "prior": 9, "pend": 9, "mode": [9, 12], "special": 9, "notif": 9, "forward": 9, "respons": 9, "duplic": [9, 30], "rout": [9, 21, 30], "repres": 9, "tree": 9, "win": [9, 17], "inhibit": 9, "mute": 9, "receiv": [9, 30], "via": [9, 17], "sluck": 9, "check": [9, 17, 27, 28, 30], "detail": [9, 25], "wors": 9, "correctli": [9, 12], "mail": 9, "simpl": 9, "negat": 9, "logic": 9, "forc": 9, "reduc": [9, 12, 19], "simul": 9, "actual": [9, 28], "scenario": 9, "expect": 9, "low": [9, 30], "space": 9, "lower": [9, 30], "fire": 9, "show": [9, 12, 14, 30], "propag": 9, "valu": [9, 12, 23, 30], "similar": [9, 12], "free": 9, "big": [9, 30], "bisect": 9, "problem": [9, 25, 30], "give": [11, 13], "modifi": 11, "upgrad": 11, "explain": [12, 25], "intern": [12, 21, 30], "issu": [12, 25, 29, 30], "whenev": 12, "gone": 12, "save": 12, "mention": 12, "earlier": 12, "overridden": 12, "perman": 12, "eventu": 12, "made": 12, "larg": [12, 25], "suggest": 12, "maintain": 12, "json": 12, "too": 12, "verbos": 12, "element": [12, 25], "object": 12, "attribut": 12, "graph": [12, 30], "aliascolor": 12, "bar": 12, "error": [12, 25, 26, 28], "fill": 12, "grid": 12, "threshold1": 12, "null": 12, "threshold1color": 12, "rgba": 12, "216": 12, "200": 12, "27": 12, "threshold2": 12, "threshold2color": 12, "234": 12, "112": 12, "22": 12, "gridpo": 12, "w": [12, 17], "x": [12, 17], "y": 12, "id": [12, 17], "isnew": 12, "legend": 12, "avg": 12, "max": 12, "min": 12, "linewidth": 12, "link": [12, 25], "nullpointmod": 12, "percentag": [12, 30], "pointradiu": 12, "render": 12, "flot": 12, "seriesoverrid": 12, "span": 12, "steppedlin": 12, "sum": 12, "node_filesystem_avail": 12, "intervalfactor": 12, "legendformat": 12, "refid": 12, "timefrom": 12, "timeshift": 12, "titl": 12, "size": [12, 22, 30], "tooltip": 12, "msresolut": 12, "share": 12, "sort": [12, 24, 30], "value_typ": 12, "cumul": 12, "transpar": 12, "xaxi": 12, "yax": 12, "percent": 12, "logbas": 12, "101": 12, "short": 12, "imagin": 12, "redund": 12, "resembl": 12, "css": 12, "hierarch": 12, "definit": [12, 30], "inherit": 12, "row": [12, 24, 30], "base_row": 12, "collaps": 12, "height": 12, "250px": 12, "150px": 12, "output": 12, "bytes_panel": 12, "byte": 12, "unit": 12, "axi": 12, "adjust": 12, "readabl": 12, "e": 12, "gb": 12, "mb": 12, "grasp": 12, "origin": [12, 27], "12": [12, 17], "wa": [12, 30], "larger": 12, "break": [12, 22, 30], "longer": 12, "later": 12, "absolut": 12, "posit": 12, "ie": 12, "width": 12, "backward": [12, 17], "ve": 12, "had": 12, "pars": [12, 23, 30], "imposs": 12, "hand": 12, "overcom": 12, "transit": 12, "calcul": 12, "taken": 12, "still": 12, "unlik": 12, "partial": 12, "24": 12, "don": 12, "python": 12, "make_dashboard": 12, "revers": [12, 25], "usual": [12, 17, 25, 30], "easier": 12, "wrapper": 12, "re": [12, 21], "just": 12, "refresh": 12, "generate_gener": 12, "mayb": 12, "interfac": [13, 17], "2021": 14, "2018": [14, 22], "14": [14, 17], "onlin": 15, "prometheus_port": 15, "restrict": 15, "prometheus_address": 15, "integr": 16, "old": 17, "howev": 17, "twice": 17, "easiest": 17, "remov": 17, "scylla_manager1": 17, "messag": 17, "wait": [17, 26], "non": [17, 20, 21, 25, 29, 30], "post": 17, "proper": 17, "past": 17, "mai": [17, 25, 26, 30], "ownership": 17, "la": 17, "grep": 17, "drwxr": 17, "xr": 17, "4096": 17, "jun": 17, "51": 17, "chown": 17, "appear": 17, "unreach": [17, 26], "immedi": 17, "suspect": 17, "tab": 17, "rang": [17, 30], "align": 17, "On": [17, 25], "41bd3db26240": 17, "entrypoin": 17, "ago": 17, "23": 17, "7001": 17, "tcp": 17, "9042": 17, "9160": 17, "10000": 17, "click": 17, "usag": [17, 21, 30], "fetch": 17, "curl": 17, "scylla_nod": 17, "return": [17, 18, 19, 20, 22, 26, 28, 30], "ef": 17, "gre": 17, "scylla_setup": 17, "9100": 17, "while": 17, "captur": 17, "tshark": 17, "f": 17, "dst": 17, "eth0": 17, "toward": 17, "199": 17, "203": 17, "229": 17, "89": 17, "142": 17, "59212": 17, "ack": 17, "seq": 17, "317": 17, "78193": 17, "158080": 17, "len": 17, "tsval": 17, "79869679": 17, "tsecr": 17, "3347447210": 17, "74": 17, "60440": 17, "syn": 17, "29200": 17, "mss": 17, "1460": 17, "sack_perm": 17, "79988291": 17, "128": 17, "side": [18, 25, 30], "primari": [18, 30], "kei": [18, 24, 30], "scan": 18, "These": [18, 30], "kind": [18, 30], "bigger": 18, "care": [18, 19, 20, 30], "replicationfactor": [19, 20], "piec": 19, "determin": [19, 20, 26, 30], "mani": [19, 20, 30], "repli": [19, 20, 22, 26, 28, 30], "fail": [19, 21, 25, 30], "unavail": [19, 30], "client": [19, 22, 25, 30], "respond": 19, "accompani": 19, "deep": 19, "understand": 19, "fall": 19, "back": 19, "mechan": 19, "write": 20, "acknowledg": 20, "coordin": [20, 21, 26, 28, 30], "hint": 20, "fact": 20, "yet": 20, "cours": [20, 21], "essenti": 20, "text": [20, 30], "20of": 20, "20the": 20, "20most": 20, "20common": 20, "20with": 20, "20lowest": 20, "20consist": 20, "distribut": [21, 29, 30], "ideal": [21, 30], "latenc": [21, 25, 30], "resourc": [21, 24, 30], "driver": [21, 22, 29, 30], "replic": [21, 26, 28, 30], "prepar": [21, 25, 29], "statement": [21, 23, 29], "balanc": [21, 25, 30], "polici": 21, "caus": [21, 30], "intro": 21, "recap": 21, "ring": [21, 30], "architectur": 21, "chunk": [22, 30], "increas": [22, 30], "overal": [22, 30], "thu": 22, "www": [22, 29], "07": 22, "13": 22, "effici": [22, 30], "optim": [23, 29, 31], "concret": 23, "thumb": 23, "alwai": 23, "favor": 23, "partit": [24, 25], "BY": [24, 30], "ineffici": [24, 30], "consum": 24, "doc": 24, "recogn": 25, "bad": 25, "practic": [25, 29], "potenti": [25, 30], "solv": 25, "left": 25, "categori": [25, 30], "jump": 25, "warn": 25, "cell": 25, "indic": [25, 30], "model": [25, 29, 30], "code": 25, "impact": 25, "imbal": 25, "shard": 25, "imbalanc": 25, "hot": 25, "bottleneck": [25, 29], "cach": 25, "hit": 25, "filter": 25, "token": 25, "awar": 25, "select": [25, 30], "page": 25, "order": [25, 30], "oper": [25, 30], "due": 25, "unsatisfi": 25, "faulti": 25, "answer": [26, 28], "aka": 26, "factor": 26, "quorum": [26, 30], "hardwar": 27, "occur": 27, "leav": 28, "risk": 28, "identifi": [28, 30], "evenli": 29, "across": 29, "becom": 29, "explan": 29, "08": 29, "best": 29, "upper": 30, "relat": 30, "gaug": 30, "inspect": 30, "zero": 30, "mislead": 30, "panel": 30, "first": 30, "holder": 30, "safer": 30, "prevent": 30, "inject": 30, "rate": 30, "did": 30, "compound": 30, "column": 30, "ks1": 30, "table_demo": 30, "int": 30, "WITH": 30, "desc": 30, "cat1": 30, "asc": 30, "overhead": 30, "thing": 30, "much": 30, "drop": 30, "were": 30, "major": 30, "success": 30, "hurt": 30, "cl": 30, "expens": 30, "term": 30, "cost": 30, "ONE": 30, "local_quorum": 30, "local_on": 30, "reli": 30, "nearest": 30, "advisor": 31}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 20, 25, 31], "monitor": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 25, 31], "stack": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 25, 31], "us": [2, 6, 8, 12, 18, 19, 20, 24, 31], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 12], "set": 2, "prometheu": [2, 4, 5, 6, 7, 8, 9, 15], "grafana": [2, 5, 6, 7, 12, 17], "provis": 2, "data": [2, 6, 8, 17], "sourc": [2, 8, 17], "file": [2, 6, 17], "dashboard": [2, 6, 12], "load": 2, "start": [2, 6, 7, 17], "stop": [2, 6], "download": 3, "instal": [3, 5, 6], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 12], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 27], "space": [4, 5, 6], "requir": [4, 5, 6], "deploi": 5, "without": 5, "alertmanag": [5, 9], "compat": 6, "matrix": [6, 14], "post": [6, 22, 29], "configur": [6, 8], "node": [6, 27], "from": [6, 12], "manag": [6, 7, 10, 17], "consul": 6, "api": 6, "connect": 6, "an": [6, 9], "extern": 6, "directori": [6, 17], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": 6, "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 12, 25, 30], "all": [7, 19], "sh": [7, 12], "command": 7, "gener": [7, 12], "option": 7, "relat": 7, "ldap": 7, "support": [7, 14], "retent": 7, "period": 7, "alert": [7, 9, 10], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 18, 19, 20, 21, 22, 23, 24, 29, 30], "updat": 8, "tip": 9, "when": 9, "ad": [9, 12], "procedur": 11, "modifi": 12, "limit": 12, "consist": [12, 19, 20, 26, 30], "between": 12, "restart": 12, "upgrad": [12, 17], "templat": 12, "class": 12, "panel": 12, "exampl": 12, "format": 12, "layout": 12, "valid": 12, "refer": 13, "guid": [13, 16], "interfac": 15, "troubleshoot": [16, 17], "problem": 17, "2": 17, "duplic": 17, "inform": 17, "A": 17, "contain": 17, "fail": [17, 26, 28], "To": 17, "And": 17, "permiss": 17, "No": 17, "point": 17, "solut": 17, "chart": 17, "show": 17, "error": [17, 27], "sign": 17, "server": 17, "level": [17, 19, 20, 26, 30], "metric": 17, "notic": 17, "user": 17, "open": 17, "3": 17, "0": 17, "enterpris": 17, "2019": 17, "1": 17, "work": 17, "wireshark": 17, "some": [18, 19, 20, 21, 22, 23, 24, 26, 28], "allow": [18, 30], "filter": [18, 30], "ani": 20, "link": [20, 21, 22, 24, 29], "univers": [20, 21], "ar": [21, 22, 23, 29], "token": [21, 30], "awar": [21, 30], "select": 22, "non": [22, 23], "page": [22, 30], "blog": [22, 29], "prepar": [23, 30], "revers": [24, 30], "order": 24, "document": 24, "advisor": 25, "section": 25, "oper": [26, 28], "due": 26, "unsatisfi": 26, "i": 27, "o": 27, "can": 27, "indic": 27, "faulti": 27, "replica": 28, "side": 28, "cql": [29, 30], "balanc": 29, "among": 29, "shard": 29, "optim": 30, "statement": 30, "read": 30, "cross": 30, "dc": 30, "request": 30}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some SELECT queries are non-paged": [[22, "some-select-queries-are-non-paged"]], "Blog-post Links": [[22, "blog-post-links"]], "Troubleshoot Scylla Monitoring Stack": [[17, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[17, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[17, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[17, "a-container-fails-to-start"]], "Files And Directory Permissions": [[17, "files-and-directory-permissions"]], "No Data Points": [[17, "no-data-points"]], "Solution": [[17, "solution"], [17, "id1"], [17, "id2"], [17, "id3"]], "Grafana Chart Shows Error (!) Sign": [[17, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[17, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[17, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[17, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[17, "working-with-wireshark"]], "Some queries use ALLOW FILTERING": [[18, "some-queries-use-allow-filtering"]], "Some queries use Consistency Level: ALL": [[19, "some-queries-use-consistency-level-all"]], "Some queries use Consistency Level: ANY": [[20, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[20, "link-to-scylla-university"]], "Some queries are not token-aware": [[21, "some-queries-are-not-token-aware"]], "University link": [[21, "university-link"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[16, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Some queries are non-prepared": [[23, "some-queries-are-non-prepared"]], "Some operation failed due to unsatisfied consistency level": [[26, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Some operations failed on the replica side": [[28, "some-operations-failed-on-the-replica-side"]], "I/O Errors can indicate a node with a faulty disk": [[27, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Using Scylla Monitoring Stack": [[31, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[30, "the-cql-optimization"]], "Prepared Statements": [[30, "prepared-statements"]], "Token Aware": [[30, "token-aware"]], "Paged Queries": [[30, "paged-queries"]], "Reversed CQL Reads": [[30, "reversed-cql-reads"]], "ALLOW FILTERING": [[30, "allow-filtering"]], "Consistency Level": [[30, "consistency-level"]], "Cross DC": [[30, "cross-dc"]], "Cross DC Consistency Level": [[30, "cross-dc-consistency-level"]], "Cross DC read requests": [[30, "cross-dc-read-requests"]], "Some queries use reverse order": [[24, "some-queries-use-reverse-order"]], "Documentation link": [[24, "documentation-link"]], "CQL queries are not balanced among shards": [[29, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[29, "blog-post-link"]], "Scylla Monitoring Stack Advisor": [[25, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[25, "the-advisor-section"]], "Scylla Monitoring Stack Support Matrix": [[14, "scylla-monitoring-stack-support-matrix"]], "Scylla Monitoring Stack Reference Guide": [[13, "scylla-monitoring-stack-reference-guide"]], "Alerting": [[9, "alerting"]], "Prometheus Alerts": [[9, "prometheus-alerts"]], "Alertmanager": [[9, "alertmanager"]], "Tips When Adding an Alert": [[9, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Interfaces": [[15, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[15, "prometheus"]], "Adding and Modifying Dashboards": [[12, "adding-and-modifying-dashboards"]], "General Limitations": [[12, "general-limitations"]], "consistency between restarts": [[12, "consistency-between-restarts"]], "consistency between upgrades": [[12, "consistency-between-upgrades"]], "Using templated Dashboards": [[12, "using-templated-dashboards"]], "The template class system": [[12, "the-template-class-system"]], "Panel example": [[12, "panel-example"]], "Grafana Formats and Layouts": [[12, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[12, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[12, "prerequisite"], [2, "prerequisite"]], "Validation": [[12, "validation"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Scylla Monitoring Stack Procedures": [[11, "scylla-monitoring-stack-procedures"]], "Scylla Monitoring Stack Alert Manager": [[10, "scylla-monitoring-stack-alert-manager"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Scylla Monitoring Stack": [[1, "scylla-monitoring-stack"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "The start-all.sh command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.7/sitemap.xml b/branch-3.7/sitemap.xml new file mode 100644 index 000000000..e595b5103 --- /dev/null +++ b/branch-3.7/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.7/troubleshooting/index.html b/branch-3.7/troubleshooting/index.html new file mode 100644 index 000000000..31ebea26b --- /dev/null +++ b/branch-3.7/troubleshooting/index.html @@ -0,0 +1,659 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Troubleshooting Guide for Scylla Monitoring Stack

              +
              +
              +

              Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/troubleshooting/monitor_troubleshoot.html b/branch-3.7/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..f0802bbca --- /dev/null +++ b/branch-3.7/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,867 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Troubleshoot Scylla Monitoring Stack

              +

              This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

              +
              +

              Problem

              + +
              +

              Scylla-Manager 2.2 with Duplicate information

              +

              Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

              +
                +
              • For Manager server: from 56090 to 5090

              • +
              • For Manager Agent: from 56090 to 5090

              • +
              +

              For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

              +

              However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

              +

              The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

              +

              Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

              +
              +
              +

              A Container Fails To Start

              +

              When running ./start-all.sh a container can fail to start. For example you can see the following error message:

              +
              Wait for Prometheus container to start........Error: Prometheus container failed to start
              +
              +
              +

              Should this happen, check the Docker logs for more information.

              +
              docker logs aprom
              +
              +
              +

              Usually the reason for the failure is described in the logs.

              +
              +
              +

              Files And Directory Permissions

              +
              +

              Note

              +

              Avoid running Docker containers as root.

              +
              +

              The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

              +

              If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

              +
              +

              Note

              +

              If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

              +
              +

              For example if your Prometheus data directory is /prom-data and you are using centos user

              +
              ls -la /|grep prom-data
              +
              +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
              +
              +sudo chown -R centos:centos /prom-data
              +
              +ls -la /|grep prom-data
              +
              +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
              +
              +
              +
              +
              +

              No Data Points

              +

              No data points on all data charts.

              +
              +

              Solution

              +

              If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

              +
                +
              1. Login to the Prometheus console:

              2. +
              3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

              4. +
              5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

              6. +
              +
              +
                +
              • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

              • +
              • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

              • +
              • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

              • +
              +
              +

              For example:

              +
              ./start-all.sh -v 3.1
              +
              +
              +

              More on start-all.sh options.

              +
              +
              +
              +

              Grafana Chart Shows Error (!) Sign

              +

              Run this procedure on the Scylla Monitoring Stack server.

              +

              If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

              +
              +

              Solution

              +

              On the Scylla Monitoring Stack server:

              +
                +
              1. Check Prometheus is running using docker ps.

              2. +
              +
                +
              • If it is not running check the prometheus.yml for errors.

              • +
              +

              For example:

              +
              CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
              +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
              +
              +
              +
                +
              • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

              • +
              +
              +
              +
              +

              Grafana Shows Server Level Metrics, but not Scylla Metrics

              +

              Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

              +
              +

              Solution

              +
                +
              • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

              • +
              +

              For example

              +
              curl 172.17.0.2:9180/metrics
              +
              +
              +
              +
              +
              +

              Grafana Shows Scylla Metrics, but not Server Level Metrics

              +

              Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

              +
              +

              Solution

              +

              1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

              +
                +
              1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

              2. +
              +
              +
              +

              Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

              +

              While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

              +

              If the node_exporter service is not starting it may need to be updated manually.

              +

              Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

              +
              +
              +
              +

              Working with Wireshark

              +

              No metrics shown in the Scylla Monitoring Stack.

              +
                +
              1. Install wireshark

              2. +
              +

              2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

              +

              For example:

              +
              tshark -i eth0 -f "dst port 9180"
              +
              +
              +

              Capture from Scylla node towards Scylla Monitoring Stack server.

              +

              In this example, Scylla is running.

              +
              Monitor ip        Scylla node ip
              +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
              +
              +
              +

              In this example, Scylla is not running

              +
              Monitor ip        Scylla node ip
              +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
              +
              +
              +
              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlAllowFiltering.html b/branch-3.7/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..8dfbb5e1a --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries use ALLOW FILTERING

              +

              Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

              +

              These kinds of queries can create a bigger load on Scylla, and should be used with care.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlCLAll.html b/branch-3.7/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..3e13aa6f4 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries use Consistency Level: ALL

              +

              Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

              +

              Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

              +

              Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlCLAny.html b/branch-3.7/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..8ae01b6e1 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries use Consistency Level: ANY

              +

              Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

              +

              Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlNoTokenAware.html b/branch-3.7/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..e15516ff7 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries are not token-aware

              +

              Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

              +

              Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlNonPaged.html b/branch-3.7/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..c61ab72a4 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some SELECT queries are non-paged

              +

              By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

              +
              +

              Blog-post Links

              +

              https://www.scylladb.com/2018/07/13/efficient-query-paging/

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlNonPrepared.html b/branch-3.7/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..599ce014c --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries are non-prepared

              +

              Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlReverseOrder.html b/branch-3.7/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..1ebc84a51 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries use reverse order

              +

              Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

              +

              Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/index.html b/branch-3.7/use-monitoring/advisor/index.html new file mode 100644 index 000000000..f88352476 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/index.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Advisor

              +
              +
              +

              The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them.

              +
              +

              The Advisor section

              +
              +../../_images/advisor_panel.png +
              +

              The Advisor section

              +
              +
              +

              The Advisor section is located on the Overview dashboard and consists of two parts:

              +

              On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

              +

              For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

              +

              On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

              +

              For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

              +

              Each Advisor issue is explained in detail:

              + +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/nodeCLErrors.html b/branch-3.7/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..9a5c31d5d --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Some operation failed due to unsatisfied consistency level

              +

              ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

              +

              For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

              +

              When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/nodeIOErrors.html b/branch-3.7/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..a576bf0b6 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              I/O Errors can indicate a node with a faulty disk

              +

              I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/nodeLocalErrors.html b/branch-3.7/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..052c3582d --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Some operations failed on the replica side

              +

              ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

              +

              An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-3.7/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..986e700cd --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              CQL queries are not balanced among shards

              +

              For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

              +

              There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

              +
              +

              Blog post link

              +

              https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/cql_optimization.html b/branch-3.7/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..0bfe8362e --- /dev/null +++ b/branch-3.7/use-monitoring/cql_optimization.html @@ -0,0 +1,788 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              The CQL Optimization

              +

              The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver.

              +
              +../_images/cql_optimization_master.png +
              +

              The CQL Dashboard

              +
              +
              +

              The upper part of the dashboard holds CQL related metrics.

              +

              The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

              +
              +

              Note

              +

              Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

              +
              +

              The following sections describe each of the dashboard’s panel

              +
              +

              Prepared Statements

              +

              Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

              +

              Using prepared statements has the following benefits:

              +
                +
              • The database only needs to parse the query once

              • +
              • The driver can route the query to the right node

              • +
              • Using place-holders and values is safer and prevents CQL-Injection

              • +
              +

              The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

              +

              The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

              +
              +
              +

              Token Aware

              +

              Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

              +

              Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

              +

              The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

              +

              The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

              +
              +
              +

              Paged Queries

              +

              By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

              +

              The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

              +

              The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

              +
              +
              +

              Reversed CQL Reads

              +

              Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

              +

              Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

              +

              For example, look at the following table:

              +
              CREATE TABLE ks1.table_demo (
              +   category text,
              +   type int,
              +   PRIMARY KEY (category, type))
              +WITH CLUSTERING ORDER BY (type DESC);
              +
              +
              +

              The following query uses reverse order:

              +
              select * from ks1.table_demo where category='cat1' order by type ASC;
              +
              +
              +

              The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

              +

              The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

              +
              +
              +

              ALLOW FILTERING

              +

              Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

              +

              These kinds of queries can create a big load on the system, and should be used with care.

              +

              The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

              +

              The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

              +

              The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

              +

              The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

              +

              The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

              +
              +
              +

              Consistency Level

              +

              Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

              +

              The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

              +

              Two consistency levels hold a potential problem and should be used with care ANY and ALL.

              +

              The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

              +

              The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

              +

              The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

              +

              The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

              +
              +
              +

              Cross DC

              +

              Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

              +
              +
              +

              Cross DC Consistency Level

              +

              Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

              +
              +
              +

              Cross DC read requests

              +
              +

              Note

              +

              The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

              +
              +

              In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

              +

              The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/index.html b/branch-3.7/use-monitoring/index.html new file mode 100644 index 000000000..0349934af --- /dev/null +++ b/branch-3.7/use-monitoring/index.html @@ -0,0 +1,659 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Using Scylla Monitoring Stack

              +
              +
              +

              There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.8/.buildinfo b/branch-3.8/.buildinfo new file mode 100644 index 000000000..91c9252de --- /dev/null +++ b/branch-3.8/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: e68fc70290b3f373909b8b7067e710be +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-3.8/.doctrees/_common/monitor-description.doctree b/branch-3.8/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..c1dafafdd Binary files /dev/null and b/branch-3.8/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-3.8/.doctrees/environment.pickle b/branch-3.8/.doctrees/environment.pickle new file mode 100644 index 000000000..ef40688d5 Binary files /dev/null and b/branch-3.8/.doctrees/environment.pickle differ diff --git a/branch-3.8/.doctrees/index.doctree b/branch-3.8/.doctrees/index.doctree new file mode 100644 index 000000000..9a4ae56c8 Binary files /dev/null and b/branch-3.8/.doctrees/index.doctree differ diff --git a/branch-3.8/.doctrees/install/docker_compose.doctree b/branch-3.8/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..dd9cbe253 Binary files /dev/null and b/branch-3.8/.doctrees/install/docker_compose.doctree differ diff --git a/branch-3.8/.doctrees/install/index.doctree b/branch-3.8/.doctrees/install/index.doctree new file mode 100644 index 000000000..6b0c79d53 Binary files /dev/null and b/branch-3.8/.doctrees/install/index.doctree differ diff --git a/branch-3.8/.doctrees/install/min-prod-hw.doctree b/branch-3.8/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..ba785429c Binary files /dev/null and b/branch-3.8/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-3.8/.doctrees/install/monitor_without_docker.doctree b/branch-3.8/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..66a0fb6a5 Binary files /dev/null and b/branch-3.8/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-3.8/.doctrees/install/monitoring_stack.doctree b/branch-3.8/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..fa15039c6 Binary files /dev/null and b/branch-3.8/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-3.8/.doctrees/install/start_all.doctree b/branch-3.8/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..d1464be05 Binary files /dev/null and b/branch-3.8/.doctrees/install/start_all.doctree differ diff --git a/branch-3.8/.doctrees/install/thanos.doctree b/branch-3.8/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..4aecdb94a Binary files /dev/null and b/branch-3.8/.doctrees/install/thanos.doctree differ diff --git a/branch-3.8/.doctrees/procedures/alerts/alerting.doctree b/branch-3.8/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..e71f5d0e3 Binary files /dev/null and b/branch-3.8/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-3.8/.doctrees/procedures/alerts/index.doctree b/branch-3.8/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..d460f8839 Binary files /dev/null and b/branch-3.8/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-3.8/.doctrees/procedures/index.doctree b/branch-3.8/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..f8fa69dfc Binary files /dev/null and b/branch-3.8/.doctrees/procedures/index.doctree differ diff --git a/branch-3.8/.doctrees/procedures/updating_dashboard.doctree b/branch-3.8/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..d7b758c32 Binary files /dev/null and b/branch-3.8/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-3.8/.doctrees/reference/index.doctree b/branch-3.8/.doctrees/reference/index.doctree new file mode 100644 index 000000000..f77cedf60 Binary files /dev/null and b/branch-3.8/.doctrees/reference/index.doctree differ diff --git a/branch-3.8/.doctrees/reference/matrix.doctree b/branch-3.8/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..cd103e88e Binary files /dev/null and b/branch-3.8/.doctrees/reference/matrix.doctree differ diff --git a/branch-3.8/.doctrees/reference/monitoring_apis.doctree b/branch-3.8/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..3cf2eb0d6 Binary files /dev/null and b/branch-3.8/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-3.8/.doctrees/troubleshooting/index.doctree b/branch-3.8/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..33cbf4e02 Binary files /dev/null and b/branch-3.8/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-3.8/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-3.8/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..d239649d4 Binary files /dev/null and b/branch-3.8/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..ce3a1a0d8 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..1c9411fa1 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..04190a998 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..d1604ec8d Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..58db7ff5e Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..7fae2be8a Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..cbbedfb3f Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/index.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..bc07bd2df Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..d539dc962 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..c7bdf7483 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..2b185cef2 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..e36390a68 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..d8063b4a5 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/cql_optimization.doctree b/branch-3.8/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..3c16a3edb Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/index.doctree b/branch-3.8/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..eccbff5b6 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-3.8/.nojekyll b/branch-3.8/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-3.8/404.html b/branch-3.8/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-3.8/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
              +

              404

              +

              The ScyllaDB monster ate your page!

              +

              + Home +

              +
              + + + \ No newline at end of file diff --git a/branch-3.8/CNAME b/branch-3.8/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-3.8/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-3.8/_common/monitor-description.html b/branch-3.8/_common/monitor-description.html new file mode 100644 index 000000000..239b6039f --- /dev/null +++ b/branch-3.8/_common/monitor-description.html @@ -0,0 +1,641 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +

              Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

              + + +
              + + + + + +
              + + +
              + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.8/_images/1.png b/branch-3.8/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.8/_images/1.png differ diff --git a/branch-3.8/_images/2.png b/branch-3.8/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.8/_images/2.png differ diff --git a/branch-3.8/_images/3.png b/branch-3.8/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.8/_images/3.png differ diff --git a/branch-3.8/_images/advisor_panel.png b/branch-3.8/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-3.8/_images/advisor_panel.png differ diff --git a/branch-3.8/_images/alertmanager.png b/branch-3.8/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.8/_images/alertmanager.png differ diff --git a/branch-3.8/_images/cql_optimization_master.png b/branch-3.8/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.8/_images/cql_optimization_master.png differ diff --git a/branch-3.8/_images/grafana.png b/branch-3.8/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.8/_images/grafana.png differ diff --git a/branch-3.8/_images/monitor.png b/branch-3.8/_images/monitor.png new file mode 100644 index 000000000..26d107a71 Binary files /dev/null and b/branch-3.8/_images/monitor.png differ diff --git a/branch-3.8/_images/monitoring_stack.png b/branch-3.8/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.8/_images/monitoring_stack.png differ diff --git a/branch-3.8/_sources/_common/monitor-description.rst.txt b/branch-3.8/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-3.8/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.8/_sources/index.rst.txt b/branch-3.8/_sources/index.rst.txt new file mode 100644 index 000000000..4ab026528 --- /dev/null +++ b/branch-3.8/_sources/index.rst.txt @@ -0,0 +1,36 @@ +Scylla Monitoring Stack +======================= + +.. toctree:: + :maxdepth: 1 + :hidden: + + User Guide + Download and Install + Procedures + Troubleshooting + Reference + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + + +For older versions of Scylla Monitoring Stack Documentation see `here `_. diff --git a/branch-3.8/_sources/install/docker_compose.rst.txt b/branch-3.8/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-3.8/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-3.8/_sources/install/index.rst.txt b/branch-3.8/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-3.8/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-3.8/_sources/install/min-prod-hw.rst.txt b/branch-3.8/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..db5d9c860 --- /dev/null +++ b/branch-3.8/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,24 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need **minimal** disk space of + +.. code:: + + 6 * 16 * 200MB ~ 20GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. diff --git a/branch-3.8/_sources/install/monitor_without_docker.rst.txt b/branch-3.8/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..33d0b1178 --- /dev/null +++ b/branch-3.8/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,437 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +``wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-3.8.0.tar.gz`` + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.8.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``scylla-monitoring-scylla-monitoring-3.7.0/prometheus`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + + cp scylla-monitoring-scylla-monitoring-3.7.0/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-3.7.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + + cd scylla-monitoring-scylla-monitoring-3.7.0/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +``cd scylla-monitoring-scylla-monitoring-3.7.0/`` + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + diff --git a/branch-3.8/_sources/install/monitoring_stack.rst.txt b/branch-3.8/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..966a30137 --- /dev/null +++ b/branch-3.8/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,378 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +.. contents:: + :depth: 2 + :local: + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API`_. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +.. _`Scylla Prometheus API`: monitoring_apis#prometheus + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can `Deploy Scylla Monitoring Stack Without Docker `_ . +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout branch-3.8 + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-3.8/_sources/install/start_all.rst.txt b/branch-3.8/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..752a98a12 --- /dev/null +++ b/branch-3.8/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh command +======================== + +Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "-storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.8/_sources/install/thanos.rst.txt b/branch-3.8/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..ffaf430af --- /dev/null +++ b/branch-3.8/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912 + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903 + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + \ No newline at end of file diff --git a/branch-3.8/_sources/procedures/alerts/alerting.rst.txt b/branch-3.8/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.8/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.8/_sources/procedures/alerts/index.rst.txt b/branch-3.8/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-3.8/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-3.8/_sources/procedures/index.rst.txt b/branch-3.8/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..5ad1f631f --- /dev/null +++ b/branch-3.8/_sources/procedures/index.rst.txt @@ -0,0 +1,18 @@ +========================================= +Scylla Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Alert Manager + Adding and Modifying Dashboards + Upgrade Guide + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* `Upgrade Guide `_ diff --git a/branch-3.8/_sources/procedures/updating_dashboard.rst.txt b/branch-3.8/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..5113102a8 --- /dev/null +++ b/branch-3.8/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,302 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It will explain about Scylla Monitoring Stack dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades. + +consistency between restarts +**************************** + +By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana. + +consistency between upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitor does. + + +Using templated Dashboards +########################## +Why does Scylla Monitor use dashboard templates? + +We found the Grafana dashboards Json format too verbose to be maintainable. + +Each element in the dashboard file (Each Json object) contains all of its attributes and values. + +For example a typical graph panel would look like: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of Grafana JSON format, we added dashboard templates. + +The template class system +*************************** + +Scylla Monitoring Stack dashboard templates use ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example row in the `type.json` defined + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +In a Template it will be used like + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +The output will be + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and override the ``height`` attribute. + + +Panel example +************* + +Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, we used the `bytes_panel` class that generate a graph with bytes as units (that would mean that your +`Y` axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc') + +You can also see that we override the `span` attribute to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +you can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` you should see that it run without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.8/_sources/reference/index.rst.txt b/branch-3.8/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-3.8/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-3.8/_sources/reference/matrix.rst.txt b/branch-3.8/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..6552164b0 --- /dev/null +++ b/branch-3.8/_sources/reference/matrix.rst.txt @@ -0,0 +1,105 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.8/_sources/reference/monitoring_apis.rst.txt b/branch-3.8/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..6d64821bc --- /dev/null +++ b/branch-3.8/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see `Scylla Monitoring Stack `_ + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.8/_sources/troubleshooting/index.rst.txt b/branch-3.8/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-3.8/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-3.8/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-3.8/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..2cc1457ea --- /dev/null +++ b/branch-3.8/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,225 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +.. contents:: + :depth: 1 + :local: + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..98a3b14d3 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/scylla-essentials-overview/lessons/high-availability/topic/consistency-level/#:~:text=Some%20of%20the%20most%20common,availability%20with%20the%20lowest%20consistency. diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-3.8/_sources/use-monitoring/advisor/index.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..e037ff90a --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-3.8/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-3.8/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-3.8/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-3.8/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-3.8/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-3.8/_sources/use-monitoring/cql_optimization.rst.txt b/branch-3.8/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..eafc82e4b --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-3.8/_sources/use-monitoring/index.rst.txt b/branch-3.8/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-3.8/_static/basic.css b/branch-3.8/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.8/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.8/_static/check-solid.svg b/branch-3.8/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.8/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.8/_static/clipboard.min.js b/branch-3.8/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.8/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.8/_static/copybutton.css b/branch-3.8/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.8/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

              Short

              + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.8/_static/copybutton.js b/branch-3.8/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.8/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.8/_static/copybutton_funcs.js b/branch-3.8/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.8/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.8/_static/css/main.css b/branch-3.8/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-3.8/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.8/_static/doctools.js b/branch-3.8/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.8/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.8/_static/documentation_options.js b/branch-3.8/_static/documentation_options.js new file mode 100644 index 000000000..237299273 --- /dev/null +++ b/branch-3.8/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.3.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.8/_static/file.png b/branch-3.8/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.8/_static/file.png differ diff --git a/branch-3.8/_static/img/banner-background.svg b/branch-3.8/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.8/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.8/_static/img/favicon-228x228.png b/branch-3.8/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.8/_static/img/favicon-228x228.png differ diff --git a/branch-3.8/_static/img/favicon-32x32.png b/branch-3.8/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.8/_static/img/favicon-32x32.png differ diff --git a/branch-3.8/_static/img/favicon.ico b/branch-3.8/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.8/_static/img/favicon.ico differ diff --git a/branch-3.8/_static/img/icons/icon-about-team.svg b/branch-3.8/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.8/_static/img/icons/icon-about-us-m.svg b/branch-3.8/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-about-us.svg b/branch-3.8/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-alternator.svg b/branch-3.8/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-apps.svg b/branch-3.8/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-architecture.svg b/branch-3.8/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.8/_static/img/icons/icon-benchmarks.svg b/branch-3.8/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.8/_static/img/icons/icon-blog.svg b/branch-3.8/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.8/_static/img/icons/icon-careers.svg b/branch-3.8/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.8/_static/img/icons/icon-chevron-left.svg b/branch-3.8/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.8/_static/img/icons/icon-chevron-right.svg b/branch-3.8/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.8/_static/img/icons/icon-circe.svg b/branch-3.8/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-clock.svg b/branch-3.8/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-close.svg b/branch-3.8/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-cloud-docs.svg b/branch-3.8/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-cloud.svg b/branch-3.8/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-comparison.svg b/branch-3.8/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.8/_static/img/icons/icon-contact-us.svg b/branch-3.8/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.8/_static/img/icons/icon-developers-blog.svg b/branch-3.8/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.8/_static/img/icons/icon-docs.svg b/branch-3.8/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.8/_static/img/icons/icon-enterprise-m.svg b/branch-3.8/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-enterprise.svg b/branch-3.8/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-events.svg b/branch-3.8/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.8/_static/img/icons/icon-exclamation.svg b/branch-3.8/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-expand.svg b/branch-3.8/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-forum.svg b/branch-3.8/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-getting-started.svg b/branch-3.8/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-glossary.svg b/branch-3.8/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-home.svg b/branch-3.8/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-infoworld.svg b/branch-3.8/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.8/_static/img/icons/icon-integrations.svg b/branch-3.8/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-knowledge-base.svg b/branch-3.8/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-less.svg b/branch-3.8/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-live-test.svg b/branch-3.8/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.8/_static/img/icons/icon-mail-list.svg b/branch-3.8/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-manager.svg b/branch-3.8/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.8/_static/img/icons/icon-memory-management.svg b/branch-3.8/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.8/_static/img/icons/icon-modeling.svg b/branch-3.8/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-monitoring.svg b/branch-3.8/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.8/_static/img/icons/icon-networking.svg b/branch-3.8/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.8/_static/img/icons/icon-news.svg b/branch-3.8/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.8/_static/img/icons/icon-newsletter.svg b/branch-3.8/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.8/_static/img/icons/icon-nsql-guides.svg b/branch-3.8/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.8/_static/img/icons/icon-open-source.svg b/branch-3.8/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.8/_static/img/icons/icon-operator.svg b/branch-3.8/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-overview.svg b/branch-3.8/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.8/_static/img/icons/icon-partners.svg b/branch-3.8/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.8/_static/img/icons/icon-plus.svg b/branch-3.8/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-pricing.svg b/branch-3.8/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.8/_static/img/icons/icon-release-notes.svg b/branch-3.8/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.8/_static/img/icons/icon-resource-center.svg b/branch-3.8/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.8/_static/img/icons/icon-roadmap.svg b/branch-3.8/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.8/_static/img/icons/icon-search.svg b/branch-3.8/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.8/_static/img/icons/icon-slack.svg b/branch-3.8/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-stack-overflow.svg b/branch-3.8/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.8/_static/img/icons/icon-summit.svg b/branch-3.8/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-support.svg b/branch-3.8/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.8/_static/img/icons/icon-tech-talks.svg b/branch-3.8/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.8/_static/img/icons/icon-testing.svg b/branch-3.8/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.8/_static/img/icons/icon-thumbs-down.svg b/branch-3.8/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-thumbs-up.svg b/branch-3.8/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-tip.svg b/branch-3.8/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.8/_static/img/icons/icon-training.svg b/branch-3.8/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.8/_static/img/icons/icon-triangle-down.svg b/branch-3.8/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.8/_static/img/icons/icon-university.svg b/branch-3.8/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.8/_static/img/icons/icon-users-blog.svg b/branch-3.8/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.8/_static/img/icons/icon-warning.svg b/branch-3.8/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-webinars.svg b/branch-3.8/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.8/_static/img/icons/icon-whitepapers.svg b/branch-3.8/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.8/_static/img/icons/icon-workshop.svg b/branch-3.8/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/logo-docs.svg b/branch-3.8/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.8/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.8/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.8/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.8/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.8/_static/img/mascots/404.jpg b/branch-3.8/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.8/_static/img/mascots/404.jpg differ diff --git a/branch-3.8/_static/img/mascots/scylla-3monsters.png b/branch-3.8/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.8/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-alternator.svg b/branch-3.8/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.8/_static/img/mascots/scylla-cloud.svg b/branch-3.8/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.8/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.8/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-computer-headset.png b/branch-3.8/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-cup-number-one.png b/branch-3.8/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-docs.svg b/branch-3.8/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.8/_static/img/mascots/scylla-drivers.svg b/branch-3.8/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.8/_static/img/mascots/scylla-enterprise.svg b/branch-3.8/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.8/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.8/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-forklift-migration.png b/branch-3.8/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-gear.png b/branch-3.8/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-hardhat.png b/branch-3.8/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-headband.png b/branch-3.8/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-headset.png b/branch-3.8/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-hearts.png b/branch-3.8/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-looking-down.png b/branch-3.8/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-looking-up.png b/branch-3.8/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.8/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.8/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-manager.svg b/branch-3.8/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.8/_static/img/mascots/scylla-monitor.svg b/branch-3.8/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.8/_static/img/mascots/scylla-movement-fast.png b/branch-3.8/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-movement.png b/branch-3.8/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-onpremise.png b/branch-3.8/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-opensource.svg b/branch-3.8/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.8/_static/img/mascots/scylla-operator.svg b/branch-3.8/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.8/_static/img/mascots/scylla-plugin.png b/branch-3.8/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-release-mascot.png b/branch-3.8/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-repair.png b/branch-3.8/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-server.png b/branch-3.8/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-sleeping.png b/branch-3.8/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-tall-measure.png b/branch-3.8/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-university.png b/branch-3.8/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-weights.png b/branch-3.8/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-window-cleaning.png b/branch-3.8/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-with-computer-2.png b/branch-3.8/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-with-computer.png b/branch-3.8/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-with-linux.png b/branch-3.8/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-writting.png b/branch-3.8/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.8/_static/img/menu.svg b/branch-3.8/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.8/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.8/_static/img/scylla-monitor.png b/branch-3.8/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.8/_static/img/scylla-monitor.png differ diff --git a/branch-3.8/_static/js/main.bundle.js b/branch-3.8/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-3.8/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
            • Back
            • ',backButtonPosition:"top",wrapper:"
              ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                "],col:[2,"","
                "],tr:[2,"","
                "],td:[3,"","
                "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + + + +
                + + + + + +
                + + +
                + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/index.html b/branch-3.8/index.html new file mode 100644 index 000000000..feaa72897 --- /dev/null +++ b/branch-3.8/index.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack

                +
                +
                +

                Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                +_images/monitor.png +

                The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

                +
                  +
                • prometheus - collects and stores metrics

                • +
                • alertmanager - handles alerts

                • +
                • grafana - dashboard server

                • +
                +

                Choose a topic to get started:

                + +

                For older versions of Scylla Monitoring Stack Documentation see here.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/docker_compose.html b/branch-3.8/install/docker_compose.html new file mode 100644 index 000000000..21dcaaf4a --- /dev/null +++ b/branch-3.8/install/docker_compose.html @@ -0,0 +1,805 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Using Docker Compose

                +

                Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                +

                Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                +
                +

                Warning

                +

                docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                +
                +
                +

                Prerequisite

                +

                Make sure you have docker and docker-compose installed.

                +
                +
                +

                Setting Prometheus

                +

                The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                +

                You can use ./prometheus-config.sh to generate the file, for example:

                +
                ./prometheus-config.sh --compose
                +
                +
                +

                For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                +
                +
                +

                Setting Grafana Provisioning

                +

                Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                +
                +

                Grafana Data-Source file

                +

                Run the following command to update the datasource:

                +
                ./grafana-datasource.sh --compose
                +
                +
                +

                You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                +
                +
                +

                Grafana Dashboard Load file

                +

                To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                +
                ./generate-dashboards.sh -t -v 2020.1
                +
                +
                +

                This command generates the files under: grafana/provisioning/dashboards/

                +
                +
                +
                +

                Docker Compose file

                +

                You can use the following example as a base for your docker compose.

                +

                Pass the following to a file called docker-compose.yml

                +
                services:
                +  alertmanager:
                +    container_name: aalert
                +    image: prom/alertmanager:v0.21.0
                +    ports:
                +    - 9093:9093
                +    volumes:
                +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                +  grafana:
                +    container_name: agraf
                +    environment:
                +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                +    # This is where you set Grafana security
                +    - GF_AUTH_BASIC_ENABLED=false
                +    - GF_AUTH_ANONYMOUS_ENABLED=true
                +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                +    - GF_SECURITY_ADMIN_PASSWORD=admin
                +    image: grafana/grafana:7.3.5
                +    ports:
                +    - 3000:3000
                +    user: 1000:1000
                +    volumes:
                +    - ./grafana/build:/var/lib/grafana/dashboards
                +    - ./grafana/plugins:/var/lib/grafana/plugins
                +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                +    # Uncomment the following line for grafana persistency
                +    # - path/to/grafana/dir:/var/lib/grafana
                +  loki:
                +    command:
                +    - --config.file=/mnt/config/loki-config.yaml
                +    container_name: loki
                +    image: grafana/loki:2.0.0
                +    ports:
                +    - 3100:3100
                +    volumes:
                +    - ./loki/rules:/etc/loki/rules
                +    - ./loki/conf:/mnt/config
                +  promotheus:
                +    command:
                +    - --config.file=/etc/prometheus/prometheus.compose.yml
                +    container_name: aprom
                +    image: prom/prometheus:v2.18.1
                +    ports:
                +    - 9090:9090
                +    volumes:
                +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                +    # Uncomment the following line for prometheus persistency 
                +    # - path/to/data/dir:/prometheus/data
                +  promtail:
                +    command:
                +    - --config.file=/etc/promtail/config.yml
                +    container_name: promtail
                +    image: grafana/promtail:2.0.0
                +    ports:
                +    - 1514:1514
                +    - 9080:9080
                +    volumes:
                +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                +version: '3'
                +
                +
                +
                +

                Start and Stop

                +

                To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                +
                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/index.html b/branch-3.8/install/index.html new file mode 100644 index 000000000..62d5d1d78 --- /dev/null +++ b/branch-3.8/install/index.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Download and Install Scylla Monitoring Stack

                +
                +
                +

                Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                +

                Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/min-prod-hw.html b/branch-3.8/install/min-prod-hw.html new file mode 100644 index 000000000..c2210d0c9 --- /dev/null +++ b/branch-3.8/install/min-prod-hw.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Minimal Production System Recommendations

                +
                  +
                • CPU - at least 2 physical cores/ 4vCPUs

                • +
                • Memory - 15GB+ DRAM

                • +
                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                • +
                • Network - 1GbE/10GbE preferred

                • +
                +
                +

                Calculating Prometheus Minimal Disk Space requirement

                +

                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                +

                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

                +

                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

                +
                6 * 16 * 200MB ~ 20GB
                +
                +
                +

                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/monitor_without_docker.html b/branch-3.8/install/monitor_without_docker.html new file mode 100644 index 000000000..414f55160 --- /dev/null +++ b/branch-3.8/install/monitor_without_docker.html @@ -0,0 +1,1049 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Deploying Scylla Monitoring Stack Without Docker

                +
                +

                Introduction

                +

                The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                +

                Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                +

                Scylla Monitoring uses the following components:

                +
                  +
                • Alertmanager

                • +
                • Grafana Loki

                • +
                • Prometheus

                • +
                • Grafana

                • +
                +

                The common scenario for users who use their own standalone installation, is they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                +

                We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                +
                +
                +

                Minimal Production System Recommendations

                +
                  +
                • CPU - at least 2 physical cores/ 4vCPUs

                • +
                • Memory - 15GB+ DRAM

                • +
                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                • +
                • Network - 1GbE/10GbE preferred

                • +
                +
                +

                Calculating Prometheus Minimal Disk Space requirement

                +

                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                +

                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

                +

                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

                +
                6 * 16 * 200MB ~ 20GB
                +
                +
                +

                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                +

                The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                +
                +

                Note

                +

                Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                +
                +
                +
                +
                +

                Install Scylla Monitoring Stack

                +

                The following procedure uses a CentOS 7 based instance

                +
                  +
                1. Download the latest Scylla Monitoring Stack release.

                2. +
                +

                wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-3.8.0.tar.gz

                +
                  +
                1. Open the tar

                2. +
                +

                tar -xvf scylla-monitoring-*.tar.gz

                +
                +
                +

                Install Alertmanager

                +

                Tested with alertmanager 0.22.2 version

                +
                  +
                1. Install alertmanager

                2. +
                +
                wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                +tar -xvf alertmanager-*.linux-amd64.tar.gz
                +
                +
                +
                  +
                1. Copy the following file: rule_config.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to alertmanager.yml in the alertmanager installation directory.

                2. +
                +

                For example:

                +
                cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.8.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                +
                +
                +
                  +
                1. Start the Alertmanager

                2. +
                +

                For example:

                +
                cd alertmanager-0.22.2.linux-amd64
                +./alertmanager
                +
                +
                +
                  +
                1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                2. +
                +

                For example:

                +
                http://192.168.135.166:9093/
                +
                +
                +../_images/alertmanager.png +
                +
                +

                Install Grafana Loki

                +

                Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                +

                We recomand using Loki with containers, but you can install it locally as described in Loki installation

                +

                You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                +

                Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                +

                Loki Related files

                +

                Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                +
                mkdir -p /etc/loki/rules
                +mkdir -p /etc/loki/config
                +cp loki/rules/* /etc/loki/rules
                +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                +
                +
                +

                Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                +

                Promtail Related files

                +

                Promtail has a configuration file. You need to copy and modify the configuration.

                +
                mkdir -p /etc/promtail/
                +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                +
                +
                +

                Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                +
                +
                +

                Install Prometheus

                +

                Tested with Prometheus version 2.27.1

                +
                +

                Note

                +

                If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                +
                +
                  +
                1. Install Prometheus

                2. +
                +
                wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                +tar -xvf prometheus-*.linux-amd64.tar.gz
                +
                +
                +

                2. Create Data and Config directories +.. code-block:: shell

                +
                +

                mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                +
                +
                  +
                1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from scylla-monitoring-scylla-monitoring-3.7.0/prometheus directory to Prometheus installation directory.

                2. +
                +

                Copy prometheus/prometheus.yml.template to prometheus.yml

                +

                For example:

                +
                cp scylla-monitoring-scylla-monitoring-3.7.0/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/
                +cp scylla-monitoring-scylla-monitoring-3.7.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                +
                +
                +
                  +
                1. Edit the prometheus.yml file to point to the correct static data sources.

                2. +
                +
                +

                Note

                +

                Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                +
                +
                vi /etc/prometheus/prometheus.yml
                +
                +
                +

                Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                +

                For example if the alertmanager will run on the same host:

                +
                alerting:
                +   alertmanagers:
                +   - static_configs:
                +       - targets:
                +           - 127.0.0.1:9093
                +
                +
                +

                Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                +

                For example the scrape config for Scylla:

                +
                global:
                +  scrape_interval: 5s # By default, scrape targets every 5 second.
                +  scrape_timeout: 4s # Timeout before trying to scape a target again
                +
                +  # Attach these labels to any time series or alerts when communicating with
                +  # external systems (federation, remote storage, Alertmanager).
                +  external_labels:
                +    monitor: 'scylla-monitor'
                +
                +scrape_configs:
                +- job_name: scylla
                +  honor_labels: false
                +  file_sd_configs:
                +    - files:
                +      - /etc/scylla.d/prometheus/scylla_servers.yml
                +  relabel_configs:
                +    - source_labels: [__address__]
                +      regex:  '([^:]+)'
                +      target_label: __address__
                +      replacement: '${1}:9180'
                +
                +    - source_labels: [__address__]
                +      regex:  '(.*):.+'
                +      target_label: instance
                +      replacement: '${1}'
                +
                +
                +
                  +
                1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                2. +
                +
                +

                Note

                +

                There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                +
                +

                An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                +
                +

                Note

                +

                You must have both files even if you are not using Scylla Manager

                +
                +

                Add the labels for the cluster and data-center

                +

                scylla_servers.yml:

                +

                For example:

                +
                cat scylla_servers.yml
                +# List Scylla end points
                +
                +- targets:
                +  - 192.168.66.6
                +  - 192.168.66.244
                +  labels:
                +    cluster: cluster1
                +    dc: dc1
                +- targets:
                +    - 172.17.0.3
                +  labels:
                +    cluster: cluster1
                +    dc: dc2
                +
                +
                +
                +

                Note

                +

                See the previous note about deprecating the node_exporter_servers.yml file.

                +
                +

                scylla_manager_server.yml

                +

                For example:

                +
                - targets:
                +  - 127.0.0.1:5090
                +
                +
                +
                  +
                1. Start Prometheus server:

                2. +
                +

                For example:

                +
                cd scylla-monitoring-scylla-monitoring-3.7.0/
                +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                +
                +
                +

                Data should start accumulate on: /prometheus/data

                +
                  +
                1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                2. +
                +

                For example:

                +
                http://192.168.135.166:9090/
                +
                +
                +../_images/1.png +

                Prometheus console should be visible

                +
                  +
                1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                2. +
                +

                For example:

                +

                node_memory_MemFree

                +../_images/2.png +

                And

                +

                scylla_reactor_utilization

                +../_images/3.png +

                At this point Scylla is emitting the metrics and Prometheus is able to store them.

                +
                +
                +

                Install Grafana

                +

                Tested with Grafna 7.5.7

                +
                  +
                1. Install Grafana based on the instructions here

                2. +
                +

                Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                +
                  +
                1. Access Scylla-Grafana-monitoring directory

                2. +
                +

                cd scylla-monitoring-scylla-monitoring-3.7.0/

                +
                  +
                1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                2. +
                +
                sudo cp -r grafana/plugins /var/lib/grafana/
                +
                +
                +

                If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                +

                For example:

                +
                cp -r grafana/plugins ../grafana-7.5.7/public/app
                +
                +
                +
                  +
                1. Provision the Dashboards

                2. +
                +

                For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                +

                For Grafana installed with yum install

                +
                sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                +sudo mkdir -p /var/lib/grafana/dashboards
                +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                +
                +
                +

                For Grafana installed from packages

                +
                cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                +
                +
                +

                Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                +
                +

                Note

                +

                A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                +
                +
                  +
                1. Set the data source by copy datasource.yml and edit it

                2. +
                +
                sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                +
                +
                +

                For Grafana installed from packages

                +
                cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                +
                +
                +

                You should set the Prometheus and the alertmanager IP and port.

                +

                For example

                +
                sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                +apiVersion: 1
                +datasources:
                + - name: prometheus
                +   type: prometheus
                +   url: http://192.168.135.167:9090
                +   access: proxy
                +   basicAuth: false
                +
                + - name: alertmanager
                +   type: camptocamp-prometheus-alertmanager-datasource
                +   orgId: 1
                +   typeLogoUrl: public/img/icn-datasource.svg
                +   access: proxy
                +   url: http://192.168.135.166:9093
                +   password:
                +   user:
                +   database:
                +   basicAuth:
                +   isDefault:
                +   jsonData:
                +     severity_critical: '4'
                +     severity_high: '3'
                +     severity_warning: '2'
                +     severity_info: '1'
                +
                +
                +
                  +
                1. Start the Grafana service

                2. +
                +

                For Grafana installed with yum install

                +

                sudo service grafana-server start

                +

                For Grafana installed from packages:

                +

                cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                +

                Edit scylla.ini to reflect the right paths in the paths section of the file.

                +
                plugins = /home/centos/grafana-7.5.7/data/plugins
                +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                +
                +
                +

                Start the server:

                +
                cd /home/centos/grafana-7.5.7/
                +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                +
                +
                +
                  +
                1. Make sure Grafana is running

                2. +
                +

                Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                +../_images/grafana.png +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/monitoring_stack.html b/branch-3.8/install/monitoring_stack.html new file mode 100644 index 000000000..20cb23d1d --- /dev/null +++ b/branch-3.8/install/monitoring_stack.html @@ -0,0 +1,1033 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Install Scylla Monitoring Stack

                + +

                This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API.

                +

                The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                +

                For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                +
                +

                Minimal Production System Recommendations

                +
                  +
                • CPU - at least 2 physical cores/ 4vCPUs

                • +
                • Memory - 15GB+ DRAM

                • +
                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                • +
                • Network - 1GbE/10GbE preferred

                • +
                +
                +

                Calculating Prometheus Minimal Disk Space requirement

                +

                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                +

                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

                +

                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

                +
                6 * 16 * 200MB ~ 20GB
                +
                +
                +

                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                +
                +
                +
                +

                Prerequisites

                +
                  +
                • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker .

                • +
                • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                • +
                + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                Scylla Monitoring Stack Compatibility Matrix

                Scylla Monitoring Stack Version

                Prometheus Version

                Grafana Version

                3.8

                2.27.1

                7.5.7

                3.7

                2.25.2

                7.4.0

                3.6

                2.18.1

                7.3.5

                3.5

                2.18.1

                7.1.5

                3.4

                2.18.1

                6.7.3

                +
                +
                +

                Docker Post Installation

                +

                Docker post installation guide can be found here

                +
                +

                Note

                +

                Avoid running the container as root.

                +
                +

                To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                +
                  +
                1. Create the Docker group.

                2. +
                +
                sudo groupadd docker
                +
                +
                +
                  +
                1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                2. +
                +
                sudo usermod -aG docker $USER
                +
                +
                +
                  +
                1. Start Docker by calling:

                2. +
                +
                sudo systemctl enable docker
                +
                +
                +
                +
                +

                Install Scylla Monitoring Stack

                +

                Procedure

                +
                  +
                1. Download and extract the latest Scylla Monitoring Stack binary;.

                2. +
                +
                wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.8.2.tar.gz
                +tar -xvf scylla-monitoring-3.8.2.tar.gz
                +cd scylla-monitoring-scylla-monitoring-3.8.2
                +
                +
                +

                As an alternative, you can clone and use the Git repository directly.

                +
                git clone https://github.com/scylladb/scylla-monitoring.git
                +cd scylla-monitoring
                +git checkout branch-3.8
                +
                +
                +
                  +
                1. Start Docker service if needed

                2. +
                +
                sudo systemctl restart docker
                +
                +
                +
                +
                +

                Configure Scylla Monitoring Stack

                +

                To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                +

                This configuration can be done from files, or using the Consul api.

                +

                Scylla Manager 2.0 and higher supports the Consul API.

                +
                +

                Configure Scylla nodes from files

                +
                  +
                1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                2. +
                +
                +

                Note

                +

                It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                +
                +

                For example:

                +
                - targets:
                +      - 172.17.0.2
                +      - 172.17.0.3
                +  labels:
                +      cluster: cluster1
                +      dc: dc1
                +
                +
                +
                +

                Note

                +

                If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                +
                +

                Using IPV6

                +

                To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                +

                For example:

                +
                - targets:
                +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                +  labels:
                +      cluster: cluster1
                +      dc: dc1
                +
                +
                +
                +

                Note

                +

                For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                +
                +

                For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                +
                +

                Note

                +

                By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                +
                +

                If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                +

                For example:

                +
                ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                +
                +
                +

                Mark the different Data Centers with Labels.

                +

                As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                +

                You can use the genconfig.py script to generate the server file. For example:

                +
                ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                +
                +
                +

                This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                +

                OR

                +

                The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                +
                nodetool status | ./genconfig.py -NS
                +
                +
                +

                2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                +

                You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                +

                For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                +
                # List Scylla Manager end points
                +
                +- targets:
                +  - 172.17.0.7:5090
                +
                +
                +

                Note that you do not need to add labels to the Scylla Manager targets.

                +
                +
                +

                Configure Scylla nodes using Scylla-Manager Consul API

                +

                Scylla Manager 2.0 has a Consul like API.

                +

                When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                +

                For example:

                +
                ./start-all.sh -L 10.10.0.1
                +
                +
                +
                +

                Note

                +

                If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                +
                +
                +
                +

                Connecting Scylla-Monitoring to Scylla

                +

                Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                +

                You can limit the user to read only, currently it only read table from the system keyspace.

                +

                To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

                +

                Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

                +
                +
                +

                Use an external directory for the Prometheus data directory

                +

                The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                +
                +

                Note

                +

                Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                +
                +

                If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                +

                In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                +
                +
                +

                Add Additional Prometheus Targets

                +

                There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                +

                The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                +

                You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                +
                - job_name: 'myservice'
                +  # Override the global default and scrape targets from this job every 5 seconds.
                +  scrape_interval: 5s
                +  static_configs:
                +    - targets:
                +      - 17.0.0.1:7000
                +
                +
                +
                +
                +
                +

                Start and Stop Scylla Monitoring Stack

                +
                +

                Start

                +
                ./start-all.sh -d prometheus_data
                +
                +
                +
                +
                +

                Stop

                +
                ./kill-all.sh
                +
                +
                +
                +
                +

                Start a Specific Scylla Monitoring Stack Version

                +

                By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                +

                You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                +

                Multiple versions are supported. For example:

                +
                ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                +
                +
                +

                will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                +
                +
                +

                Accessing the localhost

                +

                The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                +
                ./start-all.sh -l -d prometheus-data
                +
                +
                +
                +
                +

                Configure rsyslog on each Scylla node

                +

                generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                +

                Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                +

                Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                +

                If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                +
                if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                +
                +
                +

                Restart rsyslog for the configuration to take effect.

                +
                systemctl restart rsyslog
                +
                +
                +
                +
                +
                +

                View Grafana Dashboards

                +

                Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/start_all.html b/branch-3.8/install/start_all.html new file mode 100644 index 000000000..6f72b413d --- /dev/null +++ b/branch-3.8/install/start_all.html @@ -0,0 +1,745 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                The start-all.sh command

                +

                Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

                +

                The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                +
                +

                General Options

                +

                -h Help, Print the help, and exit.

                +

                –version print the current Scylla-Monitoring stack version, and exit.

                +

                -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

                +

                -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                +

                -D encapsulate docker param Allows passing additional parameters to all the docker containers.

                +

                –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                +
                + + +
                +

                Alert Manager

                +

                alertmanager handles the alerts and takes the following parameters:

                +

                -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                +

                -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                +

                -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/thanos.html b/branch-3.8/install/thanos.html new file mode 100644 index 000000000..a3ef4959b --- /dev/null +++ b/branch-3.8/install/thanos.html @@ -0,0 +1,748 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Using Thanos as Data Source With Scylla Monitoring Stack

                +

                Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as:

                +
                  +
                • High-availability.

                • +
                • Horizontal scaling.

                • +
                • Backup.

                • +
                +

                The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                +

                The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                +
                +

                Using Thanos As a Prometheus Aggregator

                +

                There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                +
                +

                Prometheus Configuration

                +

                We will assume you have two Prometheus servers running.

                +
                  +
                1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                2. +
                3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                4. +
                +
                +
                +

                Thanos sidecar

                +

                The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                +
                docker run -d \
                + -v /path/to/prom/dir:/data/prom:z \
                + -i --name sidecar thanosio/thanos \
                + sidecar \
                + --grpc-address=0.0.0.0:10911 \
                + --grpc-grace-period=1s \
                + --http-address=0.0.0.0:10912 \
                + --http-grace-period=1s \
                + --prometheus.url=http://prometheus-ip:9090 \
                + --tsdb.path=/data/prom \
                + -p 10912:10912 \
                + -p 10911:10911
                +
                +
                +

                After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                +
                +
                +

                Thanos query

                +

                Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                +
                docker run -d \
                + --name thanos -- thanosio/thanos \
                +   query \
                +   --debug.name=query0 \
                +   --log.level=debug \
                +   --grpc-address=0.0.0.0:10903 \
                +   --grpc-grace-period=1s \
                +   --http-address=0.0.0.0:10904 \
                +   --http-grace-period=1s \
                +   --query.replica-label=prometheus \
                +   --store={ip1}:10911 --store={ip2}:10911
                +
                +
                +

                After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                +
                +
                +

                Update Scylla Data source

                +

                The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                +

                The file you edit is a template file that replaces the file Grafana uses, next time you start.

                +

                Restart the Scylla Monitoring Stack it should now use Thanos.

                +
                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/objects.inv b/branch-3.8/objects.inv new file mode 100644 index 000000000..aaa23034f Binary files /dev/null and b/branch-3.8/objects.inv differ diff --git a/branch-3.8/procedures/alerts/alerting.html b/branch-3.8/procedures/alerts/alerting.html new file mode 100644 index 000000000..ab84ce6e1 --- /dev/null +++ b/branch-3.8/procedures/alerts/alerting.html @@ -0,0 +1,744 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Alerting

                +

                Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                +

                You can read more about Prometheus alerting here

                +

                By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                +

                In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                +

                The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                +../../_images/monitoring_stack.png +
                +

                Prometheus Alerts

                +

                The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                +

                Each alert consists of:

                +
                  +
                • Name

                • +
                • What happened

                • +
                • For how long

                • +
                • What to report

                • +
                +

                For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                +
                - alert: InstanceDown
                +  expr: up == 0
                +  for: 60s
                +  labels:
                +    severity: "2"
                +  annotations:
                +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                +    summary: Instance {{ $labels.instance }} down
                +
                +
                +

                The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                +

                The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                +

                The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                +

                annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                +
                +
                +

                Alertmanager

                +

                The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                +

                The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                +
                  +
                • Routes: Represent a routing tree, the most specific rule, wins

                • +
                • Inhibition: Mute an alert, based on another alert

                • +
                • Receiver: Send a notification via email, sluck, etc’

                • +
                +

                Check the Alertmanager documentation for details on how to specify a specific receiver.

                +

                In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                +
                +
                +

                Tips When Adding an Alert

                +

                It’s worse having an alert that does not work, than not having an alert at all

                +

                There are multiple ways you can use to make sure your alert is set correctly:

                +
                  +
                • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                • +
                • Force the alert to be active by reducing the limits or the duration.

                • +
                • When possible simulate the actual scenario and see that the alert works as expected.

                • +
                +

                For example, low available disk space.

                +

                Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                +

                Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                +

                Starting with a simple working expression helps you bisect problems.

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/procedures/alerts/index.html b/branch-3.8/procedures/alerts/index.html new file mode 100644 index 000000000..3dabdbe2a --- /dev/null +++ b/branch-3.8/procedures/alerts/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Alert Manager

                +
                +
                +

                Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/procedures/index.html b/branch-3.8/procedures/index.html new file mode 100644 index 000000000..dde4e6967 --- /dev/null +++ b/branch-3.8/procedures/index.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Procedures

                +
                +
                +

                There are several reference guides available which give additional information. Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/procedures/updating_dashboard.html b/branch-3.8/procedures/updating_dashboard.html new file mode 100644 index 000000000..7b8b91c7b --- /dev/null +++ b/branch-3.8/procedures/updating_dashboard.html @@ -0,0 +1,954 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Adding and Modifying Dashboards

                +

                The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                +

                It will explain about Scylla Monitoring Stack dashboard templates and how to modify them.

                + +
                +

                General Limitations

                +

                Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades.

                +
                +

                consistency between restarts

                +

                By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana.

                +
                +
                +

                consistency between upgrades

                +

                As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                +
                +

                Note

                +

                 You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided.

                +
                +

                At large, we suggest maintaining your dashboards as files, as Scylla Monitor does.

                +
                +
                +
                +

                Using templated Dashboards

                +

                Why does Scylla Monitor use dashboard templates?

                +

                We found the Grafana dashboards Json format too verbose to be maintainable.

                +

                Each element in the dashboard file (Each Json object) contains all of its attributes and values.

                +

                For example a typical graph panel would look like:

                +
                {
                +    "aliasColors": {},
                +    "bars": false,
                +    "datasource": "prometheus",
                +    "editable": true,
                +    "error": false,
                +    "fill": 0,
                +    "grid": {
                +        "threshold1": null,
                +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                +        "threshold2": null,
                +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                +    },
                +    "gridPos": {
                +        "h": 6,
                +        "w": 10,
                +        "x": 0,
                +        "y": 4
                +    },
                +    "id": 2,
                +    "isNew": true,
                +    "legend": {
                +        "avg": false,
                +        "current": false,
                +        "max": false,
                +        "min": false,
                +        "show": false,
                +        "total": false,
                +        "values": false
                +    },
                +    "lines": true,
                +    "linewidth": 2,
                +    "links": [],
                +    "nullPointMode": "connected",
                +    "percentage": false,
                +    "pointradius": 5,
                +    "points": false,
                +    "renderer": "flot",
                +    "seriesOverrides": [
                +        {}
                +    ],
                +    "span": 5,
                +    "stack": false,
                +    "steppedLine": false,
                +    "targets": [
                +        {
                +            "expr": "sum(node_filesystem_avail) by (instance)",
                +            "intervalFactor": 1,
                +            "legendFormat": "",
                +            "refId": "A",
                +            "step": 1
                +        }
                +    ],
                +    "timeFrom": null,
                +    "timeShift": null,
                +    "title": "Available Disk Size",
                +    "tooltip": {
                +        "msResolution": false,
                +        "shared": true,
                +        "sort": 0,
                +        "value_type": "cumulative"
                +    },
                +    "transparent": false,
                +    "type": "graph",
                +    "xaxis": {
                +        "show": true
                +    },
                +    "yaxes": [
                +        {
                +            "format": "percent",
                +            "logBase": 1,
                +            "max": 101,
                +            "min": 0,
                +            "show": true
                +        },
                +        {
                +            "format": "short",
                +            "logBase": 1,
                +            "max": null,
                +            "min": null,
                +            "show": true
                +        }
                +    ]
                +}
                +
                +
                +

                As you can imagine, most panels would have similar values.

                +

                To reduce the redundancy of Grafana JSON format, we added dashboard templates.

                +
                +

                The template class system

                +

                Scylla Monitoring Stack dashboard templates use class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                +

                The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes.

                +

                In the template file, you can also add or override attributes.

                +

                The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                +

                When generating dashboards, each class will be replaced by its definition.

                +

                For example row in the type.json defined

                +
                {
                + "base_row": {
                +     "collapse": false,
                +     "editable": true
                + },
                + "row": {
                +     "class": "base_row",
                +     "height": "250px"
                + }
                + }
                +
                +
                +

                In a Template it will be used like

                +
                {
                +     "class": "row",
                +     "height": "150px",
                +     "panels": [
                +     ]
                +}
                +
                +
                +

                The output will be

                +
                {
                +     "class": "row",
                +     "collapse": false,
                +     "editable": true,
                +     "height": "150px",
                +     "panels": [
                +
                +     ]
                +}
                +
                +
                +

                We can see that the template added the panels attribute and override the height attribute.

                +
                +
                +

                Panel example

                +

                Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                +
                {
                +     "class": "row",
                +     "panels": [
                +         {
                +             "class": "bytes_panel",
                +             "span": 3,
                +             "targets": [
                +                 {
                +                     "expr": "sum(node_filesystem_avail) by (instance)",
                +                     "intervalFactor": 1,
                +                     "legendFormat": "",
                +                     "metric": "",
                +                     "refId": "A",
                +                     "step": 1
                +                 }
                +             ],
                +             "title": "Available Disk Size"
                +         }
                +     ]
                +}
                +
                +
                +

                In the example, we used the bytes_panel class that generate a graph with bytes as units (that would mean that your +Y axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’)

                +

                You can also see that we override the span attribute to set the panel size.

                +

                To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                +
                +
                +

                Grafana Formats and Layouts

                +

                The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                +

                Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width).

                +

                The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                +

                To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                +

                The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                +

                you can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                +

                gridPos has the following attributes:

                +
                {
                +   "x": 0,
                +   "y": 0,
                +   "w": 24,
                +   "h": 4
                + }
                +
                +
                +

                When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                +
                {
                +   "gridPos": {
                +      "h": 2
                +    }
                +}
                +
                +
                +
                +
                +

                Generating the dashboards from templates (generate-dashboards.sh)

                +
                +

                Prerequisite

                +

                Python 2.7

                +

                make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                +

                Use the -h flag to get help information.

                +

                You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                +

                When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                +

                For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                +

                .\generate-dashboards.sh -v 2020.1

                +
                +

                Note

                +

                generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard.

                +
                +
                +
                +
                +

                Validation

                +

                After making changes to a template, run the generate_generate-dashboards.sh you should see that it run without any errors.

                +

                Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                +
                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/reference/index.html b/branch-3.8/reference/index.html new file mode 100644 index 000000000..d0eb20d4e --- /dev/null +++ b/branch-3.8/reference/index.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Reference Guide

                +
                +
                +

                There are several reference guides available which give additional information. Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/reference/matrix.html b/branch-3.8/reference/matrix.html new file mode 100644 index 000000000..b2342f13f --- /dev/null +++ b/branch-3.8/reference/matrix.html @@ -0,0 +1,783 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Support Matrix

                +

                The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                Scylla Monitoring Stack Version

                Scylla Open Source Version

                Scylla Enterprise Version

                Node_exporter[1] Version

                Scylla Manager Version

                3.8

                4.3, 4.4, 4.5

                2020.1, 2021.1

                0.17

                2.3, 2.4

                3.7

                4.2, 4.3, 4.4

                2019.1, 2020.1, 2021.1

                0.17

                2.2, 2.3

                3.6.3

                4.2, 4.3, 4.4

                2019.1, 2020.1, 2021.1

                0.17

                2.2, 2.3, 2.1

                3.6

                4.1, 4.2, 4.3

                2019.1, 2020.1

                0.17

                2.1, 2.2, 2.3

                3.6.1

                4.1, 4.2, 4.3

                2019.1, 2020.1

                0.17

                2.1, 2.2

                3.6.1

                4.1, 4.2, 4.3, 4.4

                2019.1, 2020.1

                0.17

                2.1, 2.2

                3.5

                3.3, 4.0, 4.1, 4.2

                2019.1, 2020.1

                0.17

                2.0, 2.1, 2.2

                3.4.3

                3.3, 4.0, 4.1, 4.2

                2019.1, 2020.1

                0.17

                2.0, 2.1

                3.4

                3.3, 4.0, 4.1

                2018.1, 2019.1

                0.17

                2.0, 2.1

                3.3

                3.1, 3.2, 3.3, 4.0

                2018.1, 2019.1

                0.17

                1.4, 2.0, 2.1

                3.2

                3.1, 3.2, 3.3

                2018.1, 2019.1

                0.17

                1.4, 2.0

                3.1

                2.3, 3.0, 3.1, 3.2

                2018.1, 2019.1

                0.17

                1.3, 1.4, 2.0

                3.0

                2.3, 3.0, 3.1, 3.2

                2018.1, 2019.1

                0.17

                1.3, 1.4

                2.4

                2.3, 3.0, 3.1

                2018.1, 2019.1

                0.14, 0.17

                1.3, 1.4

                2.3

                2.3, 3.0

                2018.1, 2019.1

                0.14, 0.17

                1.3

                2.2

                2.3, 3.0

                2018.1, 2019.1

                0.14, 0.17

                1.3

                2.1

                2.3, 3.0

                2018.1

                0.14, 0.17

                1.3

                +

                [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/reference/monitoring_apis.html b/branch-3.8/reference/monitoring_apis.html new file mode 100644 index 000000000..21b3fd701 --- /dev/null +++ b/branch-3.8/reference/monitoring_apis.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Interfaces

                +

                Scylla exposes two interfaces for online monitoring, as described below

                +
                +

                Prometheus

                +

                By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                +

                For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack

                +

                You can change the Prometheus listening address and port in scylla.yaml file

                +
                # prometheus port
                +# By default, Scylla opens prometheus API port on port 9180
                +# setting the port to 0 will disable the prometheus API.
                +prometheus_port: 9180
                +#
                +# prometheus address
                +# By default, Scylla binds all interfaces to the prometheus API
                +# It is possible to restrict the listening address to a specific one
                +prometheus_address: 0.0.0.0
                +
                +
                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/robots.txt b/branch-3.8/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.8/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.8/search.html b/branch-3.8/search.html new file mode 100644 index 000000000..b16fb8b27 --- /dev/null +++ b/branch-3.8/search.html @@ -0,0 +1,640 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + + + +
                + + + + + +
                + + +
                + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/searchindex.js b/branch-3.8/searchindex.js new file mode 100644 index 000000000..d78380353 --- /dev/null +++ b/branch-3.8/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "Scylla Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], "8": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], "scylla": [0, 2, 4, 7, 9, 12, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31], "monitor": [0, 2, 4, 7, 9, 12, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31], "stack": [0, 2, 4, 7, 9, 12, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 17, 18, 19, 20, 21, 24, 25, 26, 28, 30, 31], "full": [0, 1, 3, 6, 9, 18], "alert": [0, 1, 3, 5, 6, 11], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 14, 17, 26, 28, 30], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 12, 21, 30, 31], "open": [0, 1, 3, 5, 6, 14, 15], "sourc": [0, 1, 3, 5, 6, 9, 14, 30], "tool": [0, 1, 3, 17, 31], "includ": [0, 1, 3, 5], "prometheu": [0, 1, 3, 10, 12, 14, 17, 31], "grafana": [0, 1, 3, 8, 9], "well": [0, 1, 3, 6], "custom": [0, 1, 3], "dashboard": [0, 1, 3, 5, 7, 9, 11, 14, 17, 25, 31, 32], "consist": [1, 9, 25], "three": [1, 6, 9], "compon": [1, 5], "wrap": 1, "docker": [1, 3, 7, 8, 17], "collect": [1, 5, 6, 7, 8, 26, 28], "store": [1, 5, 8, 12, 19, 20, 30], "metric": [1, 4, 5, 6, 7, 8, 9, 12, 14, 31], "alertmanag": [1, 2, 7], "handl": [1, 6, 7], "server": [1, 2, 5, 6, 7, 8, 9, 12, 15, 18, 31], "choos": [1, 3, 10, 11, 13, 16, 17, 32], "topic": [1, 3, 10, 11, 13, 16, 20, 32], "get": [1, 6, 8, 9, 12, 19, 25, 29, 30, 31], "start": [1, 3, 5, 8, 9, 12], "user": [1, 2, 5, 6, 7, 18, 31], "guid": [1, 6, 11, 17], "download": [1, 5, 6], "instal": [1, 2, 17], "procedur": [1, 5, 6, 17], "troubleshoot": [1, 24], "refer": [1, 6, 11], "lesson": [1, 20, 21], "univers": 1, "For": [1, 2, 4, 5, 6, 7, 9, 12, 15, 17, 25, 26, 29, 31], "older": 1, "version": [1, 2, 5, 7, 12, 14, 17], "document": [1, 5, 6, 8, 9, 12, 17], "see": [1, 2, 4, 5, 6, 9, 12, 15, 17, 31], "here": [1, 5, 6, 7, 9, 12], "base": [2, 5, 6, 7, 8, 9, 12, 18, 31], "you": [2, 4, 5, 6, 7, 8, 9, 10, 12, 15, 17, 21, 23, 25, 31, 32], "can": [2, 5, 6, 7, 8, 9, 12, 15, 17, 18, 21, 25, 31, 32], "all": [2, 3, 5, 6, 8, 9, 12, 15, 17, 18, 22, 25, 31], "sh": [2, 3, 6, 17], "kill": [2, 6, 17], "script": [2, 3, 6, 7, 12], "an": [2, 4, 5, 7, 8, 12, 17, 23, 24, 25, 26, 28, 30, 31], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 9, 12, 15], "requir": [2, 8, 19, 22, 26, 31], "more": [2, 6, 9, 12, 15, 17, 18, 21, 24, 26, 29, 31], "manual": [2, 17], "step": [2, 5, 8, 12, 17], "onc": [2, 23, 30, 31], "configur": [2, 5, 7, 9, 12, 15, 17, 25], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 17, 25, 26, 27, 30, 31, 32], "two": [2, 6, 7, 8, 15, 25, 30, 31], "wai": [2, 5, 7, 9, 17, 24, 31], "launch": 2, "should": [2, 5, 6, 8, 12, 17, 18, 19, 22, 23, 24, 29, 31], "one": [2, 6, 7, 15, 19, 21, 22, 25, 26, 31], "both": [2, 5, 6, 17, 31], "In": [2, 6, 9, 12, 17, 31], "particular": 2, "creat": [2, 5, 6, 7, 9, 12, 17, 18, 30, 31], "updat": [2, 5, 12, 17], "yml": [2, 5, 6, 7, 8, 9, 17, 31], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 17, 20, 25, 26, 31], "make": [2, 5, 6, 7, 8, 9, 12, 17, 25, 31], "sure": [2, 5, 6, 8, 9, 12, 17, 31], "have": [2, 4, 5, 6, 7, 8, 9, 12, 17], "among": [2, 25], "other": [2, 8, 9], "ip": [2, 5, 6, 7, 8, 15, 17], "address": [2, 5, 6, 7, 8, 15, 17], "either": [2, 6], "locat": [2, 7, 9, 25], "scylla_serv": [2, 5, 6, 17, 31], "consul": [2, 7], "manag": [2, 5, 11, 14, 16], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 31], "exampl": [2, 4, 5, 6, 7, 8, 9, 17, 25, 26, 31], "product": [2, 7], "system": [2, 7, 9, 10, 19, 25, 31], "advis": [2, 25], "extern": [2, 5, 7, 8, 9, 12, 17, 31], "directori": [2, 5, 7, 8, 9, 12], "databas": [2, 5, 7, 21, 31], "accordingli": 2, "below": [2, 6, 9, 15], "read": [2, 6, 8, 9, 17, 18, 22], "its": [2, 6, 7, 8, 12], "from": [2, 5, 7, 8, 9, 17, 18, 24, 27, 31], "note": [2, 5, 6, 7, 17], "latter": 2, "tell": 2, "where": [2, 5, 6, 12, 17, 31], "themselv": [2, 12], "which": [2, 8, 11, 12, 13, 14, 24, 26, 28, 30, 31], "differ": [2, 5, 6, 7, 8, 12, 23, 24, 31], "run": [2, 3, 5, 6, 7, 8, 12, 14, 17], "follow": [2, 4, 5, 6, 7, 12, 14, 17, 31], "command": [2, 6, 8, 17], "datasourc": [2, 5, 6, 8, 12], "under": [2, 5, 6], "yaml": [2, 5, 6, 15], "To": [2, 4, 5, 6, 12, 15], "sashboard": 2, "t": [2, 12], "line": [2, 6, 7, 8, 12], "flag": [2, 6, 7, 8, 12, 17], "v": [2, 6, 7, 8, 12, 17], "specifi": [2, 6, 7, 9, 12, 17], "enterpris": [2, 6, 12, 14], "2020": [2, 6, 12, 14], "1": [2, 5, 6, 7, 8, 12, 14], "thi": [2, 4, 5, 6, 7, 8, 9, 12, 17, 18, 19, 22, 25, 27, 31], "your": [2, 5, 6, 7, 8, 9, 10, 12, 15, 17, 19, 20, 21, 31], "pass": [2, 6, 7], "call": [2, 6, 7], "servic": [2, 5, 6, 7, 17], "container_nam": 2, "aalert": 2, "imag": [2, 17], "prom": [2, 8, 17], "v0": [2, 5], "21": 2, "0": [2, 5, 6, 7, 8, 9, 12, 14, 15], "port": [2, 5, 6, 7, 15, 17], "9093": [2, 5], "volum": [2, 4, 5, 6], "rule_config": [2, 5, 7, 9], "etc": [2, 5, 6, 7, 9, 12], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 12], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "scylladb": [2, 5, 6, 20, 21, 22, 24, 26, 28, 29], "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 12], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 12, 14], "5": [2, 4, 5, 6, 12, 14, 17], "3000": [2, 5, 6], "1000": 2, "build": [2, 5], "plugin": [2, 5], "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 20, 26, 28, 31], "path": [2, 5, 6, 7, 8, 9], "dir": [2, 7, 8], "loki": [2, 6], "mnt": 2, "3100": [2, 5], "rule": [2, 5, 7, 9, 23], "conf": [2, 5, 6], "promotheu": 2, "aprom": [2, 17], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 17], "d": [2, 5, 6, 7, 8], "scylla_manager_serv": [2, 5, 6, 17], "node_exporter_serv": [2, 5, 6], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 9, 17, 31], "down": [2, 9, 17, 19, 26], "begin": [3, 10, 11, 13, 16, 32], "deploi": [3, 6], "without": [3, 6, 7, 12], "us": [3, 4, 5, 7, 9, 10, 17, 21, 25, 26, 28, 30, 31], "compos": 3, "thano": 3, "cpu": [4, 5, 6], "least": [4, 5, 6], "physic": [4, 5, 6], "core": [4, 5, 6], "4vcpu": [4, 5, 6], "memori": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "storag": [4, 5, 6, 7, 12], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 26, 30], "retent": [4, 5, 6], "period": [4, 5, 6, 8, 9, 30], "section": [4, 5, 6, 17, 31], "network": [4, 5, 6, 7, 17], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 17], "perform": [4, 5, 6, 25, 29, 31], "block": [4, 5, 6], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 9, 21, 26, 28, 31], "default": [4, 5, 6, 7, 9, 12, 15, 17, 22, 31], "15": [4, 5, 6], "dai": [4, 5, 6, 7], "around": [4, 5, 6, 17], "200mb": [4, 5, 6], "per": [4, 5, 6, 8, 31], "assum": [4, 5, 6, 7, 8, 9], "scrape": [4, 5, 6], "interv": [4, 5, 6], "6": [4, 5, 6, 12, 14], "node": [4, 5, 7, 14, 17, 19, 20, 21, 25, 26, 28, 29, 31], "cluster": [4, 5, 6, 24, 31], "each": [4, 5, 7, 8, 9, 12, 14, 17, 19, 21, 25, 30, 31], "16": [4, 5, 6, 17], "time": [4, 5, 6, 7, 8, 9, 23, 30, 31], "need": [4, 5, 6, 7, 8, 12, 17, 19, 20, 21, 31], "20gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 12, 17, 27, 31], "replac": [4, 5, 6, 8, 12], "ad": [4, 5, 6, 7, 11], "we": [4, 5, 6, 8, 12, 31], "alloc": [4, 5, 6], "x4": [4, 5, 6], "case": [4, 5, 6, 7, 8, 9, 12, 17, 19, 31], "100gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 9, 12, 17, 30, 31], "fast": [4, 5, 6], "enough": [4, 5, 6], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 9, 12, 17, 19, 25, 31], "out": [4, 5, 6, 8], "box": [4, 5, 6, 8], "instruct": [5, 6], "help": [5, 7, 9, 12, 31], "pleas": [5, 17], "most": [5, 9, 12, 25, 27, 31], "current": [5, 6, 7, 9, 12, 17], "common": [5, 7, 31], "scenario": [5, 9], "who": 5, "own": [5, 6, 7, 17], "standalon": 5, "thei": [5, 7, 9, 29, 30], "alreadi": 5, "would": [5, 6, 8, 9, 12, 18, 21, 31], "consolid": 5, "add": [5, 7, 8, 9, 12, 15, 31], "componen": 5, "suggest": [5, 12], "those": 5, "offici": 5, "also": [5, 6, 7, 8, 9, 12], "main": [5, 30], "item": 5, "set": [5, 6, 7, 9, 12, 15], "avail": [5, 6, 8, 9, 11, 12, 13, 19, 20, 31], "data": [5, 7, 9, 12, 18, 19, 20, 21, 25, 26, 28, 29, 31], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 17], "befor": [5, 6, 9, 19, 20, 26, 31], "support": [5, 6, 12, 13, 18, 24, 31], "want": [5, 6, 9], "latest": [5, 6, 7], "releas": 5, "tightli": 5, "compat": [5, 12, 17], "matrix": [5, 13], "cento": [5, 17], "instanc": [5, 6, 9, 12], "wget": [5, 6], "http": [5, 6, 8, 17, 20, 21, 22, 24, 29], "github": [5, 6], "com": [5, 6, 20, 21, 22, 24, 29], "archiv": [5, 6], "ref": 5, "tag": 5, "tar": [5, 6], "gz": [5, 6], "xvf": [5, 6], "test": [5, 17, 31], "22": [5, 12], "linux": 5, "amd64": 5, "copi": 5, "file": [5, 7, 8, 9, 12, 15], "cp": 5, "p": [5, 7, 8, 17], "home": 5, "cd": [5, 6], "verifi": 5, "point": [5, 6, 12], "browser": [5, 6, 8, 12, 17], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 17], "aggreg": 5, "inspir": 5, "central": 5, "check": [5, 9, 17, 27, 28, 31], "recomand": 5, "local": [5, 6, 7, 8, 12, 17, 31], "describ": [5, 6, 8, 15, 17, 31], "respons": [5, 9], "pars": [5, 12, 23, 31], "act": [5, 6, 8, 9], "proemtheu": 5, "sent": [5, 9, 26, 28], "load": [5, 6, 17, 18, 21, 22, 31], "multipl": [5, 6, 7, 8, 9, 12, 19, 22, 23, 29, 31], "do": [5, 6, 7, 12, 17, 21, 31], "rsyslog": 5, "second": [5, 6, 9, 17], "relat": [5, 31], "modifi": [5, 11], "mkdir": 5, "templat": [5, 6, 8, 17, 31], "edit": [5, 6, 7, 8, 12, 17], "e": [5, 12], "localhost": [5, 7], "loki_ip": 5, "": [5, 6, 7, 9, 12, 18, 19, 27, 30, 31], "27": [5, 6, 12], "If": [5, 6, 7, 8, 12, 17, 27, 29, 30, 31], "besid": [5, 7, 31], "expect": [5, 9], "scrap": 5, "job": [5, 6, 17], "take": [5, 6, 7, 12, 17], "onli": [5, 6, 7, 21, 23, 30, 31], "import": [5, 6, 7], "record": 5, "asspect": 5, "work": [5, 6, 7, 8, 9, 12], "code": [5, 25], "shell": 5, "prom_rul": 5, "correct": 5, "static": 5, "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 24], "host": [5, 6, 7, 17], "static_config": [5, 6], "target": [5, 7, 12, 15, 17], "127": [5, 7, 17], "right": [5, 6, 12, 25, 31], "typic": [5, 12, 19, 21, 30, 31], "node_export": [5, 6, 7, 14, 17], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 9, 12, 15, 22, 31], "everi": [5, 6, 7], "scrape_timeout": 5, "4": [5, 6, 12, 14], "timeout": 5, "try": [5, 17], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 9], "ani": [5, 6, 9, 12, 17, 25, 31], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": 5, "scrape_config": 5, "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 15, 17], "There": [5, 6, 8, 9, 11, 12, 13, 29, 32], "instead": [5, 6, 8, 31], "found": [5, 6, 7, 9, 12], "must": [5, 6, 26], "even": [5, 6, 7], "center": [5, 6, 8, 31], "cat": 5, "list": [5, 6], "end": [5, 6, 31], "66": [5, 17], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8], "dc1": [5, 6], "172": [5, 6, 17], "17": [5, 6, 14, 17], "dc2": [5, 6], "previou": 5, "about": [5, 9, 12, 25], "deprec": 5, "5090": [5, 6, 17], "tsdb": [5, 7, 8], "accumul": 5, "consol": [5, 17], "visibl": 5, "execut": [5, 18, 23], "queri": [5, 25, 26, 28], "through": 5, "node_memory_memfre": 5, "And": 5, "scylla_reactor_util": 5, "At": [5, 12], "emit": 5, "abl": [5, 8], "them": [5, 7, 9, 12, 25], "grafna": 5, "depend": [5, 8], "repositori": [5, 6], "yum": 5, "zip": 5, "structur": 5, "rest": [5, 8], "access": [5, 7], "sudo": [5, 6, 17], "r": [5, 7, 12, 17], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 12, 17], "provis": [5, 6, 12], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 12, 19, 20, 26, 30, 31], "folder": 5, "name": [5, 6, 8, 9, 17, 31], "otherwis": 5, "apivers": 5, "type": [5, 12, 31], "url": [5, 8], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "setup": 6, "dedic": 6, "so": [6, 7, 8, 9, 12, 17, 21, 31], "pull": [6, 17], "over": 6, "evalu": 6, "laptop": 6, "tabl": [6, 9, 14, 18, 25, 31], "25": [6, 17], "avoid": [6, 12, 17, 22, 24, 31], "root": [6, 17], "go": [6, 17], "group": [6, 9], "groupadd": 6, "new": [6, 17, 30], "activ": [6, 9], "next": [6, 7, 8], "login": [6, 17], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 17], "extract": 6, "binari": [6, 17], "As": [6, 12, 23], "clone": 6, "git": 6, "directli": 6, "checkout": 6, "branch": 6, "restart": [6, 7, 8], "know": [6, 17, 21, 31], "done": [6, 7, 12, 17], "higher": [6, 21, 31], "wish": [6, 7], "match": [6, 31], "datacent": 6, "nodetool": 6, "statu": [6, 17], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8], "listen": [6, 7, 15], "inform": [6, 7, 11, 12, 13, 15, 18, 19, 20], "agent": [6, 7, 8, 14, 17], "machin": [6, 7, 17], "overrid": [6, 7, 12], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 12], "myconf": 6, "four": 6, "OR": 6, "look": [6, 8, 9, 12, 31], "l": [6, 7, 17], "10": [6, 9, 12], "within": [6, 9], "cql": [6, 25, 32], "protect": 6, "author": [6, 7], "assign": 6, "limit": [6, 8, 9, 22, 31], "keyspac": 6, "securejsondata": 6, "part": [6, 9, 18, 21, 25, 31], "place": [6, 7, 8, 12, 31], "outsid": [6, 7], "result": [6, 7, 19, 21, 22, 30, 31], "lost": [6, 7, 12, 31], "exist": [6, 12, 31], "permiss": 6, "somewher": 6, "els": [6, 7], "situat": [6, 7, 9, 31], "firewal": [6, 17], "7000": [6, 17], "myservic": 6, "m": [6, 7], "2019": [6, 14, 29], "reach": [6, 8, 21, 26, 31], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 9, 21, 22, 26, 28, 31], "than": [6, 9, 12, 31], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 12, 17], "authent": [6, 7], "disabl": [6, 15], "option": [6, 8, 17], "simplest": 7, "small": [7, 30], "util": [7, 12], "appropri": 7, "h": [7, 12], "print": 7, "exit": 7, "applic": 7, "becaus": [7, 17, 26], "cannot": [7, 26], "map": 7, "bind": [7, 15], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 20, 23, 25], "addit": [7, 9, 11, 13, 31], "auto": 7, "automat": 7, "failur": [7, 17], "g": 7, "gui": [7, 12, 17], "keep": 7, "clear": 7, "comma": 7, "separ": 7, "come": [7, 9], "specif": [7, 9, 15, 17, 27, 31], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "role": 7, "privileg": 7, "That": [7, 9, 12], "mean": [7, 12, 18, 19, 20, 21, 22, 26, 28, 31], "chang": [7, 12, 15, 17], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 12], "b": 7, "o": [7, 14, 25], "disk": [7, 9, 12, 17, 18, 20, 25], "relev": [7, 25], "possibl": [7, 9, 15, 24, 31], "api": [7, 8, 15], "resolv": 7, "explicitli": [7, 12], "week": 7, "request": [7, 15, 25], "how": [7, 8, 9, 12, 19, 20, 21, 25, 31], "someth": [7, 9, 10, 12, 30], "opportun": 7, "demonstr": 7, "cover": 7, "30": [7, 9], "30d": 7, "anoth": [7, 9], "arbitrari": 7, "opensourc": 8, "top": 8, "additiuon": 8, "high": [8, 12, 20], "horizont": 8, "scale": 8, "backup": 8, "benefit": [8, 31], "flexibl": 8, "design": 8, "some": [8, 9, 25, 29], "front": 8, "few": 8, "reason": [8, 12, 17, 28, 31], "why": [8, 12], "total": [8, 12], "million": 8, "singl": [8, 12, 25], "capac": 8, "sometim": 8, "traffic": [8, 17, 29, 31], "between": [8, 17, 25, 31], "reachabl": 8, "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 12, 20], "expos": [8, 15], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 25], "10903": 8, "10904": 8, "replica": [8, 19, 20, 21, 25, 26, 31], "connect": [8, 12, 15, 17], "abov": 8, "last": 8, "db_address": 8, "could": [8, 25, 29, 31], "long": [8, 9, 30], "now": [8, 9], "enhanc": [9, 10], "notifi": [9, 10, 25], "wrong": [9, 10, 12, 17, 30, 31], "shown": [9, 17], "overview": [9, 20, 25], "email": 9, "slack": 9, "condit": 9, "met": 9, "certain": 9, "defin": [9, 12, 24, 31], "what": 9, "happen": [9, 17], "report": [9, 14, 17, 31], "let": 9, "u": 9, "instancedown": 9, "expr": [9, 12], "60": 9, "sever": [9, 11, 13, 32], "annot": 9, "descript": [9, 25], "been": 9, "summari": 9, "legal": 9, "express": 9, "equal": 9, "minim": 9, "durat": 9, "prior": 9, "pend": 9, "mode": [9, 12], "special": 9, "notif": 9, "forward": 9, "duplic": [9, 31], "rout": [9, 21, 31], "repres": 9, "tree": 9, "win": [9, 17], "inhibit": 9, "mute": 9, "receiv": [9, 31], "via": [9, 17], "sluck": 9, "detail": [9, 25], "wors": 9, "correctli": [9, 12], "mail": 9, "simpl": 9, "negat": 9, "logic": 9, "forc": 9, "reduc": [9, 12, 19], "simul": 9, "actual": [9, 28], "low": [9, 31], "space": 9, "lower": [9, 31], "fire": 9, "show": [9, 12, 14, 31], "propag": 9, "valu": [9, 12, 23, 30, 31], "similar": [9, 12], "free": 9, "big": [9, 31], "bisect": 9, "problem": [9, 25, 31], "give": [11, 13], "upgrad": 11, "explain": [12, 25], "intern": [12, 21, 31], "issu": [12, 25, 29, 31], "whenev": 12, "gone": 12, "save": 12, "mention": 12, "earlier": 12, "overridden": 12, "perman": 12, "eventu": 12, "made": 12, "larg": [12, 25], "maintain": 12, "json": 12, "too": [12, 30], "verbos": 12, "element": [12, 25], "object": 12, "attribut": 12, "graph": [12, 31], "aliascolor": 12, "bar": 12, "error": [12, 25, 26, 28], "fill": 12, "grid": 12, "threshold1": 12, "null": 12, "threshold1color": 12, "rgba": 12, "216": 12, "200": 12, "threshold2": 12, "threshold2color": 12, "234": 12, "112": 12, "gridpo": 12, "w": [12, 17], "x": [12, 17], "y": 12, "id": [12, 17], "isnew": 12, "legend": 12, "avg": 12, "max": 12, "min": 12, "linewidth": 12, "link": [12, 25], "nullpointmod": 12, "percentag": [12, 31], "pointradiu": 12, "render": 12, "flot": 12, "seriesoverrid": 12, "span": 12, "steppedlin": 12, "sum": 12, "node_filesystem_avail": 12, "intervalfactor": 12, "legendformat": 12, "refid": 12, "timefrom": 12, "timeshift": 12, "titl": 12, "size": [12, 22, 31], "tooltip": 12, "msresolut": 12, "share": 12, "sort": [12, 24, 31], "value_typ": 12, "cumul": 12, "transpar": 12, "xaxi": 12, "yax": 12, "percent": 12, "logbas": 12, "101": 12, "short": 12, "imagin": 12, "redund": 12, "resembl": 12, "css": 12, "hierarch": 12, "definit": [12, 31], "inherit": 12, "row": [12, 24, 31], "base_row": 12, "collaps": 12, "height": 12, "250px": 12, "150px": 12, "output": 12, "bytes_panel": 12, "byte": 12, "unit": 12, "axi": 12, "adjust": 12, "readabl": 12, "gb": 12, "mb": 12, "grasp": 12, "origin": [12, 27], "12": [12, 17], "wa": [12, 31], "larger": 12, "break": [12, 22, 31], "longer": 12, "later": 12, "absolut": 12, "posit": 12, "ie": 12, "width": 12, "backward": [12, 17], "ve": 12, "had": 12, "imposs": 12, "hand": 12, "overcom": 12, "transit": 12, "calcul": 12, "taken": 12, "still": 12, "unlik": 12, "partial": 12, "24": 12, "don": 12, "python": 12, "make_dashboard": 12, "revers": [12, 25], "usual": [12, 17, 25, 31], "easier": 12, "wrapper": 12, "re": [12, 21], "just": 12, "refresh": 12, "generate_gener": 12, "mayb": 12, "interfac": [13, 17], "2021": 14, "2018": [14, 22], "14": [14, 17], "onlin": 15, "prometheus_port": 15, "restrict": 15, "prometheus_address": 15, "integr": 16, "56090": 17, "old": 17, "howev": 17, "twice": 17, "easiest": 17, "remov": 17, "scylla_manager1": 17, "messag": 17, "wait": [17, 26], "non": [17, 20, 21, 25, 29, 31], "post": 17, "proper": 17, "past": 17, "mai": [17, 25, 26, 31], "ownership": 17, "la": 17, "grep": 17, "drwxr": 17, "xr": 17, "4096": 17, "jun": 17, "51": 17, "chown": 17, "appear": 17, "unreach": [17, 26], "immedi": 17, "suspect": 17, "tab": 17, "rang": [17, 31], "align": 17, "On": [17, 25], "41bd3db26240": 17, "entrypoin": 17, "ago": 17, "23": 17, "7001": 17, "tcp": 17, "9042": 17, "9160": 17, "10000": 17, "click": 17, "usag": [17, 21, 31], "fetch": 17, "curl": 17, "scylla_nod": 17, "return": [17, 18, 19, 20, 22, 26, 28, 31], "ef": 17, "gre": 17, "scylla_setup": 17, "9100": 17, "while": 17, "captur": 17, "tshark": 17, "f": 17, "dst": 17, "eth0": 17, "toward": 17, "199": 17, "203": 17, "229": 17, "89": 17, "142": 17, "59212": 17, "ack": 17, "seq": 17, "317": 17, "78193": 17, "158080": 17, "len": 17, "tsval": 17, "79869679": 17, "tsecr": 17, "3347447210": 17, "74": 17, "60440": 17, "syn": 17, "29200": 17, "mss": 17, "1460": 17, "sack_perm": 17, "79988291": 17, "128": 17, "side": [18, 25, 31], "primari": [18, 31], "kei": [18, 24, 31], "scan": 18, "These": [18, 31], "kind": [18, 31], "bigger": 18, "care": [18, 19, 20, 31], "replicationfactor": [19, 20], "piec": 19, "determin": [19, 20, 26, 31], "mani": [19, 20, 31], "repli": [19, 20, 22, 26, 28, 31], "fail": [19, 21, 25, 31], "unavail": [19, 31], "client": [19, 22, 25, 31], "respond": 19, "accompani": 19, "deep": 19, "understand": 19, "fall": 19, "back": 19, "mechan": 19, "write": 20, "acknowledg": 20, "coordin": [20, 21, 26, 28, 31], "hint": 20, "fact": 20, "yet": 20, "cours": [20, 21], "essenti": 20, "text": [20, 31], "20of": 20, "20the": 20, "20most": 20, "20common": 20, "20with": 20, "20lowest": 20, "20consist": 20, "distribut": [21, 29, 31], "ideal": [21, 31], "latenc": [21, 25, 31], "resourc": [21, 24, 31], "driver": [21, 22, 29, 31], "replic": [21, 26, 28, 31], "prepar": [21, 25, 29], "statement": [21, 23, 25, 29], "balanc": [21, 25, 31], "polici": 21, "caus": [21, 31], "intro": 21, "recap": 21, "ring": [21, 31], "architectur": 21, "chunk": [22, 31], "increas": [22, 31], "overal": [22, 31], "thu": 22, "www": [22, 29], "07": 22, "13": 22, "effici": [22, 31], "optim": [23, 29, 32], "concret": 23, "thumb": 23, "alwai": 23, "favor": 23, "partit": [24, 25], "BY": [24, 31], "ineffici": [24, 31], "consum": 24, "doc": 24, "recogn": 25, "bad": 25, "practic": [25, 29], "potenti": [25, 31], "solv": 25, "left": 25, "categori": [25, 31], "jump": 25, "warn": 25, "cell": 25, "indic": [25, 30, 31], "model": [25, 29, 31], "impact": 25, "imbal": 25, "shard": 25, "imbalanc": 25, "hot": 25, "bottleneck": [25, 29], "cach": 25, "hit": 25, "filter": 25, "token": 25, "awar": 25, "select": [25, 31], "page": 25, "order": [25, 31], "oper": [25, 31], "due": 25, "unsatisfi": 25, "faulti": 25, "evict": 25, "answer": [26, 28], "aka": 26, "factor": 26, "quorum": [26, 31], "hardwar": 27, "occur": 27, "leav": 28, "risk": 28, "identifi": [28, 31], "evenli": 29, "across": 29, "becom": 29, "explan": 29, "08": 29, "20": 29, "best": 29, "field": 30, "being": 30, "defi": 30, "purpos": 30, "might": 30, "upper": 31, "gaug": 31, "inspect": 31, "zero": 31, "mislead": 31, "panel": 31, "first": 31, "holder": 31, "safer": 31, "prevent": 31, "inject": 31, "rate": 31, "did": 31, "compound": 31, "column": 31, "ks1": 31, "table_demo": 31, "int": 31, "WITH": 31, "desc": 31, "cat1": 31, "asc": 31, "overhead": 31, "thing": 31, "much": 31, "drop": 31, "were": 31, "major": 31, "success": 31, "hurt": 31, "cl": 31, "expens": 31, "term": 31, "cost": 31, "ONE": 31, "local_quorum": 31, "local_on": 31, "reli": 31, "nearest": 31, "advisor": 32}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 20, 25, 32], "monitor": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 25, 32], "stack": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 25, 32], "us": [2, 6, 8, 12, 18, 19, 20, 24, 32], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 12], "set": 2, "prometheu": [2, 4, 5, 6, 7, 8, 9, 15], "grafana": [2, 5, 6, 7, 12, 17], "provis": 2, "data": [2, 6, 8, 17], "sourc": [2, 8, 17], "file": [2, 6, 17], "dashboard": [2, 6, 12], "load": 2, "start": [2, 6, 7, 17], "stop": [2, 6], "download": 3, "instal": [3, 5, 6], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 12], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 27], "space": [4, 5, 6], "requir": [4, 5, 6], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 9], "loki": 5, "compat": 6, "matrix": [6, 14], "post": [6, 22, 29], "configur": [6, 8], "node": [6, 27], "from": [6, 12], "manag": [6, 7, 10, 17], "consul": 6, "api": 6, "connect": 6, "an": [6, 9], "extern": 6, "directori": [6, 17], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": 6, "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 12, 25, 31], "all": [7, 19], "sh": [7, 12], "command": 7, "gener": [7, 12], "option": 7, "relat": 7, "ldap": 7, "support": [7, 14], "retent": 7, "period": 7, "alert": [7, 9, 10], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 18, 19, 20, 21, 22, 23, 24, 29, 31], "updat": 8, "tip": 9, "when": 9, "ad": [9, 12], "procedur": 11, "modifi": 12, "limit": 12, "consist": [12, 19, 20, 26, 31], "between": 12, "restart": 12, "upgrad": [12, 17], "templat": 12, "class": 12, "panel": 12, "exampl": 12, "format": 12, "layout": 12, "valid": 12, "refer": 13, "guid": [13, 16], "interfac": 15, "troubleshoot": [16, 17], "problem": 17, "2": 17, "duplic": 17, "inform": 17, "A": 17, "contain": 17, "fail": [17, 26, 28], "To": 17, "And": 17, "permiss": 17, "No": 17, "point": 17, "solut": 17, "chart": 17, "show": 17, "error": [17, 27], "sign": 17, "server": 17, "level": [17, 19, 20, 26, 31], "metric": 17, "notic": 17, "user": 17, "open": 17, "3": 17, "0": 17, "enterpris": 17, "2019": 17, "1": 17, "work": 17, "wireshark": 17, "some": [18, 19, 20, 21, 22, 23, 24, 26, 28], "allow": [18, 31], "filter": [18, 31], "ani": 20, "link": [20, 21, 22, 24, 29], "univers": [20, 21], "ar": [21, 22, 23, 29], "token": [21, 31], "awar": [21, 31], "select": 22, "non": [22, 23], "page": [22, 31], "blog": [22, 29], "prepar": [23, 30, 31], "revers": [24, 31], "order": 24, "document": 24, "advisor": 25, "section": 25, "oper": [26, 28], "due": 26, "unsatisfi": 26, "i": 27, "o": 27, "can": 27, "indic": 27, "faulti": 27, "replica": 28, "side": 28, "cql": [29, 31], "balanc": 29, "among": 29, "shard": 29, "statement": [30, 31], "cach": 30, "evict": 30, "optim": 31, "read": 31, "cross": 31, "dc": 31, "request": 31}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some queries are not token-aware": [[21, "some-queries-are-not-token-aware"]], "University link": [[21, "university-link"]], "Some SELECT queries are non-paged": [[22, "some-select-queries-are-non-paged"]], "Blog-post Links": [[22, "blog-post-links"]], "Some queries use ALLOW FILTERING": [[18, "some-queries-use-allow-filtering"]], "Some queries use Consistency Level: ANY": [[20, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[20, "link-to-scylla-university"]], "Some queries use Consistency Level: ALL": [[19, "some-queries-use-consistency-level-all"]], "Troubleshoot Scylla Monitoring Stack": [[17, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[17, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[17, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[17, "a-container-fails-to-start"]], "Files And Directory Permissions": [[17, "files-and-directory-permissions"]], "No Data Points": [[17, "no-data-points"]], "Solution": [[17, "solution"], [17, "id1"], [17, "id2"], [17, "id3"]], "Grafana Chart Shows Error (!) Sign": [[17, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[17, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[17, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[17, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[17, "working-with-wireshark"]], "Some queries are non-prepared": [[23, "some-queries-are-non-prepared"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[16, "troubleshooting-guide-for-scylla-monitoring-stack"]], "CQL queries are not balanced among shards": [[29, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[29, "blog-post-link"]], "Prepared statements cache eviction": [[30, "prepared-statements-cache-eviction"]], "Some operation failed due to unsatisfied consistency level": [[26, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "The CQL Optimization": [[31, "the-cql-optimization"]], "Prepared Statements": [[31, "prepared-statements"]], "Token Aware": [[31, "token-aware"]], "Paged Queries": [[31, "paged-queries"]], "Reversed CQL Reads": [[31, "reversed-cql-reads"]], "ALLOW FILTERING": [[31, "allow-filtering"]], "Consistency Level": [[31, "consistency-level"]], "Cross DC": [[31, "cross-dc"]], "Cross DC Consistency Level": [[31, "cross-dc-consistency-level"]], "Cross DC read requests": [[31, "cross-dc-read-requests"]], "Scylla Monitoring Stack Advisor": [[25, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[25, "the-advisor-section"]], "I/O Errors can indicate a node with a faulty disk": [[27, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some operations failed on the replica side": [[28, "some-operations-failed-on-the-replica-side"]], "Some queries use reverse order": [[24, "some-queries-use-reverse-order"]], "Documentation link": [[24, "documentation-link"]], "Using Scylla Monitoring Stack": [[32, "using-scylla-monitoring-stack"]], "Scylla Monitoring Stack Support Matrix": [[14, "scylla-monitoring-stack-support-matrix"]], "Scylla Monitoring Stack Interfaces": [[15, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[15, "prometheus"]], "Adding and Modifying Dashboards": [[12, "adding-and-modifying-dashboards"]], "General Limitations": [[12, "general-limitations"]], "consistency between restarts": [[12, "consistency-between-restarts"]], "consistency between upgrades": [[12, "consistency-between-upgrades"]], "Using templated Dashboards": [[12, "using-templated-dashboards"]], "The template class system": [[12, "the-template-class-system"]], "Panel example": [[12, "panel-example"]], "Grafana Formats and Layouts": [[12, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[12, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[12, "prerequisite"], [2, "prerequisite"]], "Validation": [[12, "validation"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Alerting": [[9, "alerting"]], "Prometheus Alerts": [[9, "prometheus-alerts"]], "Alertmanager": [[9, "alertmanager"]], "Tips When Adding an Alert": [[9, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Alert Manager": [[10, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Stack Procedures": [[11, "scylla-monitoring-stack-procedures"]], "Scylla Monitoring Stack Reference Guide": [[13, "scylla-monitoring-stack-reference-guide"]], "The start-all.sh command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Scylla Monitoring Stack": [[1, "scylla-monitoring-stack"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Minimal Production System Recommendations": [[6, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[6, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.8/sitemap.xml b/branch-3.8/sitemap.xml new file mode 100644 index 000000000..609b6adc9 --- /dev/null +++ b/branch-3.8/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.8/troubleshooting/index.html b/branch-3.8/troubleshooting/index.html new file mode 100644 index 000000000..624e65191 --- /dev/null +++ b/branch-3.8/troubleshooting/index.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Troubleshooting Guide for Scylla Monitoring Stack

                +
                +
                +

                Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/troubleshooting/monitor_troubleshoot.html b/branch-3.8/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..4a0c95f94 --- /dev/null +++ b/branch-3.8/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,868 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Troubleshoot Scylla Monitoring Stack

                +

                This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                +
                +

                Problem

                + +
                +

                Scylla-Manager 2.2 with Duplicate information

                +

                Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                +
                  +
                • For Manager server: from 56090 to 5090

                • +
                • For Manager Agent: from 56090 to 5090

                • +
                +

                For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                +

                However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                +

                The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                +

                Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                +
                +
                +

                A Container Fails To Start

                +

                When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                +
                Wait for Prometheus container to start........Error: Prometheus container failed to start
                +
                +
                +

                Should this happen, check the Docker logs for more information.

                +
                docker logs aprom
                +
                +
                +

                Usually the reason for the failure is described in the logs.

                +
                +
                +

                Files And Directory Permissions

                +
                +

                Note

                +

                Avoid running Docker containers as root.

                +
                +

                The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                +

                If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                +
                +

                Note

                +

                If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                +
                +

                For example if your Prometheus data directory is /prom-data and you are using centos user

                +
                ls -la /|grep prom-data
                +
                +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                +
                +sudo chown -R centos:centos /prom-data
                +
                +ls -la /|grep prom-data
                +
                +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                +
                +
                +
                +
                +

                No Data Points

                +

                No data points on all data charts.

                +
                +

                Solution

                +

                If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                +
                  +
                1. Login to the Prometheus console:

                2. +
                3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                4. +
                5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                6. +
                +
                +
                  +
                • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                • +
                • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                • +
                • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                • +
                +
                +

                For example:

                +
                ./start-all.sh -v 3.1
                +
                +
                +

                More on start-all.sh options.

                +
                +
                +
                +

                Grafana Chart Shows Error (!) Sign

                +

                Run this procedure on the Scylla Monitoring Stack server.

                +

                If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                +
                +

                Solution

                +

                On the Scylla Monitoring Stack server:

                +
                  +
                1. Check Prometheus is running using docker ps.

                2. +
                +
                  +
                • If it is not running check the prometheus.yml for errors.

                • +
                +

                For example:

                +
                CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                +
                +
                +
                  +
                • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                • +
                +
                +
                +
                +

                Grafana Shows Server Level Metrics, but not Scylla Metrics

                +

                Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                +
                +

                Solution

                +
                  +
                • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                • +
                +

                For example

                +
                curl 172.17.0.2:9180/metrics
                +
                +
                +
                +
                +
                +

                Grafana Shows Scylla Metrics, but not Server Level Metrics

                +

                Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                +
                +

                Solution

                +

                1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                +
                  +
                1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                2. +
                +
                +
                +

                Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                +

                While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                +

                If the node_exporter service is not starting it may need to be updated manually.

                +

                Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                +
                +
                +
                +

                Working with Wireshark

                +

                No metrics shown in the Scylla Monitoring Stack.

                +
                  +
                1. Install wireshark

                2. +
                +

                2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                +

                For example:

                +
                tshark -i eth0 -f "dst port 9180"
                +
                +
                +

                Capture from Scylla node towards Scylla Monitoring Stack server.

                +

                In this example, Scylla is running.

                +
                Monitor ip        Scylla node ip
                +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                +
                +
                +

                In this example, Scylla is not running

                +
                Monitor ip        Scylla node ip
                +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                +
                +
                +
                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlAllowFiltering.html b/branch-3.8/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..196ddbc94 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries use ALLOW FILTERING

                +

                Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                +

                These kinds of queries can create a bigger load on Scylla, and should be used with care.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlCLAll.html b/branch-3.8/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..629b0d84b --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries use Consistency Level: ALL

                +

                Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                +

                Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                +

                Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlCLAny.html b/branch-3.8/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..5db78ce44 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries use Consistency Level: ANY

                +

                Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                +

                Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlNoTokenAware.html b/branch-3.8/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..fa898002c --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries are not token-aware

                +

                Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                +

                Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlNonPaged.html b/branch-3.8/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..e708ca1da --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some SELECT queries are non-paged

                +

                By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                +
                +

                Blog-post Links

                +

                https://www.scylladb.com/2018/07/13/efficient-query-paging/

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlNonPrepared.html b/branch-3.8/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..c1d86f35a --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries are non-prepared

                +

                Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlReverseOrder.html b/branch-3.8/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..831e6862b --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries use reverse order

                +

                Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                +

                Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/index.html b/branch-3.8/use-monitoring/advisor/index.html new file mode 100644 index 000000000..5b6eec681 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/index.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Advisor

                +
                +
                +

                The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them.

                +
                +

                The Advisor section

                +
                +../../_images/advisor_panel.png +
                +

                The Advisor section

                +
                +
                +

                The Advisor section is located on the Overview dashboard and consists of two parts:

                +

                On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                +

                For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                +

                On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                +

                For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                +

                Each Advisor issue is explained in detail:

                + +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/nodeCLErrors.html b/branch-3.8/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..fc563bbda --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Some operation failed due to unsatisfied consistency level

                +

                ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                +

                For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                +

                When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/nodeIOErrors.html b/branch-3.8/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..91e5bec19 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                I/O Errors can indicate a node with a faulty disk

                +

                I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/nodeLocalErrors.html b/branch-3.8/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..0692ca864 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Some operations failed on the replica side

                +

                ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                +

                An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-3.8/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..5bf74350d --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                CQL queries are not balanced among shards

                +

                For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                +

                There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                +
                +

                Blog post link

                +

                https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/preparedCacheEviction.html b/branch-3.8/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..f7014bce2 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Prepared statements cache eviction

                +

                Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                +
                  +
                • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                • +
                • The prepared statements cache might be too small for the number of prepared statements.

                • +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/cql_optimization.html b/branch-3.8/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..035a83947 --- /dev/null +++ b/branch-3.8/use-monitoring/cql_optimization.html @@ -0,0 +1,789 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                The CQL Optimization

                +

                The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver.

                +
                +../_images/cql_optimization_master.png +
                +

                The CQL Dashboard

                +
                +
                +

                The upper part of the dashboard holds CQL related metrics.

                +

                The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                +
                +

                Note

                +

                Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                +
                +

                The following sections describe each of the dashboard’s panel

                +
                +

                Prepared Statements

                +

                Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                +

                Using prepared statements has the following benefits:

                +
                  +
                • The database only needs to parse the query once

                • +
                • The driver can route the query to the right node

                • +
                • Using place-holders and values is safer and prevents CQL-Injection

                • +
                +

                The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                +

                The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                +
                +
                +

                Token Aware

                +

                Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                +

                Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                +

                The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                +

                The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                +
                +
                +

                Paged Queries

                +

                By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                +

                The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                +

                The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                +
                +
                +

                Reversed CQL Reads

                +

                Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                +

                Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                +

                For example, look at the following table:

                +
                CREATE TABLE ks1.table_demo (
                +   category text,
                +   type int,
                +   PRIMARY KEY (category, type))
                +WITH CLUSTERING ORDER BY (type DESC);
                +
                +
                +

                The following query uses reverse order:

                +
                select * from ks1.table_demo where category='cat1' order by type ASC;
                +
                +
                +

                The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                +

                The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                +
                +
                +

                ALLOW FILTERING

                +

                Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                +

                These kinds of queries can create a big load on the system, and should be used with care.

                +

                The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                +

                The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                +

                The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                +

                The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                +

                The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                +
                +
                +

                Consistency Level

                +

                Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                +

                The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                +

                Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                +

                The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                +

                The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                +

                The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                +

                The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                +
                +
                +

                Cross DC

                +

                Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                +
                +
                +

                Cross DC Consistency Level

                +

                Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                +
                +
                +

                Cross DC read requests

                +
                +

                Note

                +

                The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                +
                +

                In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                +

                The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/index.html b/branch-3.8/use-monitoring/index.html new file mode 100644 index 000000000..7dbd7500b --- /dev/null +++ b/branch-3.8/use-monitoring/index.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Using Scylla Monitoring Stack

                +
                +
                +

                There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.9/.buildinfo b/branch-3.9/.buildinfo new file mode 100644 index 000000000..35def8103 --- /dev/null +++ b/branch-3.9/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 4351699735afdae382b9e0bac9aa0287 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-3.9/.doctrees/_common/monitor-description.doctree b/branch-3.9/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..96606fc96 Binary files /dev/null and b/branch-3.9/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-3.9/.doctrees/environment.pickle b/branch-3.9/.doctrees/environment.pickle new file mode 100644 index 000000000..be380f9fb Binary files /dev/null and b/branch-3.9/.doctrees/environment.pickle differ diff --git a/branch-3.9/.doctrees/index.doctree b/branch-3.9/.doctrees/index.doctree new file mode 100644 index 000000000..85d8f3f97 Binary files /dev/null and b/branch-3.9/.doctrees/index.doctree differ diff --git a/branch-3.9/.doctrees/install/docker_compose.doctree b/branch-3.9/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..b7f01278a Binary files /dev/null and b/branch-3.9/.doctrees/install/docker_compose.doctree differ diff --git a/branch-3.9/.doctrees/install/index.doctree b/branch-3.9/.doctrees/install/index.doctree new file mode 100644 index 000000000..ffda4a5f8 Binary files /dev/null and b/branch-3.9/.doctrees/install/index.doctree differ diff --git a/branch-3.9/.doctrees/install/min-prod-hw.doctree b/branch-3.9/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..e69d8f414 Binary files /dev/null and b/branch-3.9/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-3.9/.doctrees/install/monitor_without_docker.doctree b/branch-3.9/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..f94f8e495 Binary files /dev/null and b/branch-3.9/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-3.9/.doctrees/install/monitoring_stack.doctree b/branch-3.9/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..07bff92de Binary files /dev/null and b/branch-3.9/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-3.9/.doctrees/install/start_all.doctree b/branch-3.9/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..41d121228 Binary files /dev/null and b/branch-3.9/.doctrees/install/start_all.doctree differ diff --git a/branch-3.9/.doctrees/install/thanos.doctree b/branch-3.9/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..e7a239b8d Binary files /dev/null and b/branch-3.9/.doctrees/install/thanos.doctree differ diff --git a/branch-3.9/.doctrees/intro.doctree b/branch-3.9/.doctrees/intro.doctree new file mode 100644 index 000000000..beca5a992 Binary files /dev/null and b/branch-3.9/.doctrees/intro.doctree differ diff --git a/branch-3.9/.doctrees/procedures/alerts/alerting.doctree b/branch-3.9/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..c369924c1 Binary files /dev/null and b/branch-3.9/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-3.9/.doctrees/procedures/alerts/index.doctree b/branch-3.9/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..2e1f3905c Binary files /dev/null and b/branch-3.9/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-3.9/.doctrees/procedures/index.doctree b/branch-3.9/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..9743fcfe8 Binary files /dev/null and b/branch-3.9/.doctrees/procedures/index.doctree differ diff --git a/branch-3.9/.doctrees/procedures/updating_dashboard.doctree b/branch-3.9/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..e63e31505 Binary files /dev/null and b/branch-3.9/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-3.9/.doctrees/reference/index.doctree b/branch-3.9/.doctrees/reference/index.doctree new file mode 100644 index 000000000..cc921f5fd Binary files /dev/null and b/branch-3.9/.doctrees/reference/index.doctree differ diff --git a/branch-3.9/.doctrees/reference/matrix.doctree b/branch-3.9/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..e67065953 Binary files /dev/null and b/branch-3.9/.doctrees/reference/matrix.doctree differ diff --git a/branch-3.9/.doctrees/reference/monitoring_apis.doctree b/branch-3.9/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..bc2f22a0a Binary files /dev/null and b/branch-3.9/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-3.9/.doctrees/troubleshooting/index.doctree b/branch-3.9/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..0718fa669 Binary files /dev/null and b/branch-3.9/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-3.9/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-3.9/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..a533644b5 Binary files /dev/null and b/branch-3.9/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-3.9/.doctrees/upgrade/index.doctree b/branch-3.9/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..b073bbd5a Binary files /dev/null and b/branch-3.9/.doctrees/upgrade/index.doctree differ diff --git a/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..1330b996a Binary files /dev/null and b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..3820c31fe Binary files /dev/null and b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..b25797662 Binary files /dev/null and b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..8787ba8ac Binary files /dev/null and b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..1b0a48851 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..2641656c3 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..0e704924c Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..1ffa9d125 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..9a362e6a1 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..8d61b0ab6 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..b0ac8d5ba Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/index.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..7f9ac3483 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..cd5310325 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..2167622fc Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..d51a68dbb Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..25affead3 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..f5a91109e Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/cql_optimization.doctree b/branch-3.9/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..aca773ebb Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/index.doctree b/branch-3.9/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..ecea32ba9 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-3.9/.nojekyll b/branch-3.9/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-3.9/404.html b/branch-3.9/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-3.9/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                +

                404

                +

                The ScyllaDB monster ate your page!

                +

                + Home +

                +
                + + + \ No newline at end of file diff --git a/branch-3.9/CNAME b/branch-3.9/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-3.9/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-3.9/_common/monitor-description.html b/branch-3.9/_common/monitor-description.html new file mode 100644 index 000000000..77ed3ff7e --- /dev/null +++ b/branch-3.9/_common/monitor-description.html @@ -0,0 +1,650 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +

                Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                + + +
                + + + + + +
                + + +
                + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.9/_images/1.png b/branch-3.9/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.9/_images/1.png differ diff --git a/branch-3.9/_images/2.png b/branch-3.9/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.9/_images/2.png differ diff --git a/branch-3.9/_images/3.png b/branch-3.9/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.9/_images/3.png differ diff --git a/branch-3.9/_images/advisor_panel.png b/branch-3.9/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-3.9/_images/advisor_panel.png differ diff --git a/branch-3.9/_images/alertmanager.png b/branch-3.9/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.9/_images/alertmanager.png differ diff --git a/branch-3.9/_images/cql_optimization_master.png b/branch-3.9/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.9/_images/cql_optimization_master.png differ diff --git a/branch-3.9/_images/grafana.png b/branch-3.9/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.9/_images/grafana.png differ diff --git a/branch-3.9/_images/monitor.png b/branch-3.9/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-3.9/_images/monitor.png differ diff --git a/branch-3.9/_images/monitoring_stack.png b/branch-3.9/_images/monitoring_stack.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-3.9/_images/monitoring_stack.png differ diff --git a/branch-3.9/_images/monitoring_stack1.png b/branch-3.9/_images/monitoring_stack1.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.9/_images/monitoring_stack1.png differ diff --git a/branch-3.9/_sources/_common/monitor-description.rst.txt b/branch-3.9/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-3.9/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.9/_sources/index.rst.txt b/branch-3.9/_sources/index.rst.txt new file mode 100644 index 000000000..9233bc21d --- /dev/null +++ b/branch-3.9/_sources/index.rst.txt @@ -0,0 +1,42 @@ +======================== +Scylla Monitoring Stack +======================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `Scylla Monitoring Stack lesson `_ on Scylla University +* `Scylla Monitoring Stack GitHub Project `_ + +For older versions of Scylla Monitoring Stack Documentation see `here `_. \ No newline at end of file diff --git a/branch-3.9/_sources/install/docker_compose.rst.txt b/branch-3.9/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-3.9/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-3.9/_sources/install/index.rst.txt b/branch-3.9/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-3.9/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-3.9/_sources/install/min-prod-hw.rst.txt b/branch-3.9/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..443638374 --- /dev/null +++ b/branch-3.9/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,32 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. diff --git a/branch-3.9/_sources/install/monitor_without_docker.rst.txt b/branch-3.9/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..662dbb776 --- /dev/null +++ b/branch-3.9/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,437 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +``wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-3.9.0.tar.gz`` + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``scylla-monitoring-scylla-monitoring-3.9.0/prometheus`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.9.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``scylla-monitoring-scylla-monitoring-3.9.0/prometheus`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + + cp scylla-monitoring-scylla-monitoring-3.9.0/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-3.9.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + + cd scylla-monitoring-scylla-monitoring-3.9.0/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +``cd scylla-monitoring-scylla-monitoring-3.9.0/`` + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + diff --git a/branch-3.9/_sources/install/monitoring_stack.rst.txt b/branch-3.9/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..305bb1182 --- /dev/null +++ b/branch-3.9/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,382 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +.. contents:: + :depth: 2 + :local: + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API`_. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +.. _`Scylla Prometheus API`: monitoring_apis#prometheus + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can `Deploy Scylla Monitoring Stack Without Docker `_ . +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout branch-3.9 + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-3.9/_sources/install/start_all.rst.txt b/branch-3.9/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..574e6861c --- /dev/null +++ b/branch-3.9/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh command +======================== + +Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.9/_sources/install/thanos.rst.txt b/branch-3.9/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..ffaf430af --- /dev/null +++ b/branch-3.9/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912 + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903 + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + \ No newline at end of file diff --git a/branch-3.9/_sources/intro.rst.txt b/branch-3.9/_sources/intro.rst.txt new file mode 100644 index 000000000..8bad4d48a --- /dev/null +++ b/branch-3.9/_sources/intro.rst.txt @@ -0,0 +1,49 @@ +======================= +Scylla Monitoring Stack +======================= + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the `node_exporter` agent that runs on the Scylla server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + + +For older versions of Scylla Monitoring Stack Documentation see `here `_. diff --git a/branch-3.9/_sources/procedures/alerts/alerting.rst.txt b/branch-3.9/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.9/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.9/_sources/procedures/alerts/index.rst.txt b/branch-3.9/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-3.9/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-3.9/_sources/procedures/index.rst.txt b/branch-3.9/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..5ad1f631f --- /dev/null +++ b/branch-3.9/_sources/procedures/index.rst.txt @@ -0,0 +1,18 @@ +========================================= +Scylla Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Alert Manager + Adding and Modifying Dashboards + Upgrade Guide + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* `Upgrade Guide `_ diff --git a/branch-3.9/_sources/procedures/updating_dashboard.rst.txt b/branch-3.9/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..5113102a8 --- /dev/null +++ b/branch-3.9/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,302 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It will explain about Scylla Monitoring Stack dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades. + +consistency between restarts +**************************** + +By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana. + +consistency between upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitor does. + + +Using templated Dashboards +########################## +Why does Scylla Monitor use dashboard templates? + +We found the Grafana dashboards Json format too verbose to be maintainable. + +Each element in the dashboard file (Each Json object) contains all of its attributes and values. + +For example a typical graph panel would look like: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of Grafana JSON format, we added dashboard templates. + +The template class system +*************************** + +Scylla Monitoring Stack dashboard templates use ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example row in the `type.json` defined + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +In a Template it will be used like + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +The output will be + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and override the ``height`` attribute. + + +Panel example +************* + +Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, we used the `bytes_panel` class that generate a graph with bytes as units (that would mean that your +`Y` axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc') + +You can also see that we override the `span` attribute to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +you can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` you should see that it run without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.9/_sources/reference/index.rst.txt b/branch-3.9/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-3.9/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-3.9/_sources/reference/matrix.rst.txt b/branch-3.9/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..0bc86c809 --- /dev/null +++ b/branch-3.9/_sources/reference/matrix.rst.txt @@ -0,0 +1,110 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.9/_sources/reference/monitoring_apis.rst.txt b/branch-3.9/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..6d64821bc --- /dev/null +++ b/branch-3.9/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see `Scylla Monitoring Stack `_ + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.9/_sources/troubleshooting/index.rst.txt b/branch-3.9/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-3.9/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-3.9/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-3.9/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..2cc1457ea --- /dev/null +++ b/branch-3.9/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,225 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +.. contents:: + :depth: 1 + :local: + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.9/_sources/upgrade/index.rst.txt b/branch-3.9/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..f4d76733b --- /dev/null +++ b/branch-3.9/_sources/upgrade/index.rst.txt @@ -0,0 +1,39 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                +
                +
                +
                Upgrade Scylla Open Source
                +
                +
                + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                +
                +
                diff --git a/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..64ea1f3c1 --- /dev/null +++ b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,104 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + +.. contents:: + :local: + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** montioring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade
                ` +* `Prometheus Migration `_ diff --git a/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..21d3a7160 --- /dev/null +++ b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,135 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + +.. contents:: + :local: + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..87b2d767c --- /dev/null +++ b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,66 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +.. contents:: + :local: + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..03f6f268d --- /dev/null +++ b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,142 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +.. contents:: + :local: + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..98a3b14d3 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/scylla-essentials-overview/lessons/high-availability/topic/consistency-level/#:~:text=Some%20of%20the%20most%20common,availability%20with%20the%20lowest%20consistency. diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-3.9/_sources/use-monitoring/advisor/index.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..6d4d3e6fe --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-3.9/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-3.9/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-3.9/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-3.9/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-3.9/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-3.9/_sources/use-monitoring/cql_optimization.rst.txt b/branch-3.9/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..eafc82e4b --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-3.9/_sources/use-monitoring/index.rst.txt b/branch-3.9/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-3.9/_static/basic.css b/branch-3.9/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.9/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.9/_static/check-solid.svg b/branch-3.9/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.9/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.9/_static/clipboard.min.js b/branch-3.9/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.9/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.9/_static/copybutton.css b/branch-3.9/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.9/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                Short

                + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.9/_static/copybutton.js b/branch-3.9/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.9/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.9/_static/copybutton_funcs.js b/branch-3.9/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.9/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.9/_static/css/main.css b/branch-3.9/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-3.9/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.9/_static/doctools.js b/branch-3.9/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.9/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.9/_static/documentation_options.js b/branch-3.9/_static/documentation_options.js new file mode 100644 index 000000000..237299273 --- /dev/null +++ b/branch-3.9/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.3.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.9/_static/file.png b/branch-3.9/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.9/_static/file.png differ diff --git a/branch-3.9/_static/img/banner-background.svg b/branch-3.9/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.9/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.9/_static/img/favicon-228x228.png b/branch-3.9/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.9/_static/img/favicon-228x228.png differ diff --git a/branch-3.9/_static/img/favicon-32x32.png b/branch-3.9/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.9/_static/img/favicon-32x32.png differ diff --git a/branch-3.9/_static/img/favicon.ico b/branch-3.9/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.9/_static/img/favicon.ico differ diff --git a/branch-3.9/_static/img/icons/icon-about-team.svg b/branch-3.9/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.9/_static/img/icons/icon-about-us-m.svg b/branch-3.9/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-about-us.svg b/branch-3.9/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-alternator.svg b/branch-3.9/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-apps.svg b/branch-3.9/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-architecture.svg b/branch-3.9/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.9/_static/img/icons/icon-benchmarks.svg b/branch-3.9/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.9/_static/img/icons/icon-blog.svg b/branch-3.9/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.9/_static/img/icons/icon-careers.svg b/branch-3.9/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.9/_static/img/icons/icon-chevron-left.svg b/branch-3.9/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.9/_static/img/icons/icon-chevron-right.svg b/branch-3.9/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.9/_static/img/icons/icon-circe.svg b/branch-3.9/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-clock.svg b/branch-3.9/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-close.svg b/branch-3.9/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-cloud-docs.svg b/branch-3.9/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-cloud.svg b/branch-3.9/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-comparison.svg b/branch-3.9/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.9/_static/img/icons/icon-contact-us.svg b/branch-3.9/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.9/_static/img/icons/icon-developers-blog.svg b/branch-3.9/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.9/_static/img/icons/icon-docs.svg b/branch-3.9/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.9/_static/img/icons/icon-enterprise-m.svg b/branch-3.9/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-enterprise.svg b/branch-3.9/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-events.svg b/branch-3.9/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.9/_static/img/icons/icon-exclamation.svg b/branch-3.9/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-expand.svg b/branch-3.9/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-forum.svg b/branch-3.9/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-getting-started.svg b/branch-3.9/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-glossary.svg b/branch-3.9/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-home.svg b/branch-3.9/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-infoworld.svg b/branch-3.9/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.9/_static/img/icons/icon-integrations.svg b/branch-3.9/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-knowledge-base.svg b/branch-3.9/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-less.svg b/branch-3.9/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-live-test.svg b/branch-3.9/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.9/_static/img/icons/icon-mail-list.svg b/branch-3.9/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-manager.svg b/branch-3.9/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.9/_static/img/icons/icon-memory-management.svg b/branch-3.9/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.9/_static/img/icons/icon-modeling.svg b/branch-3.9/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-monitoring.svg b/branch-3.9/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.9/_static/img/icons/icon-networking.svg b/branch-3.9/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.9/_static/img/icons/icon-news.svg b/branch-3.9/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.9/_static/img/icons/icon-newsletter.svg b/branch-3.9/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.9/_static/img/icons/icon-nsql-guides.svg b/branch-3.9/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.9/_static/img/icons/icon-open-source.svg b/branch-3.9/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.9/_static/img/icons/icon-operator.svg b/branch-3.9/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-overview.svg b/branch-3.9/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.9/_static/img/icons/icon-partners.svg b/branch-3.9/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.9/_static/img/icons/icon-plus.svg b/branch-3.9/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-pricing.svg b/branch-3.9/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.9/_static/img/icons/icon-release-notes.svg b/branch-3.9/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.9/_static/img/icons/icon-resource-center.svg b/branch-3.9/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.9/_static/img/icons/icon-roadmap.svg b/branch-3.9/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.9/_static/img/icons/icon-search.svg b/branch-3.9/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.9/_static/img/icons/icon-slack.svg b/branch-3.9/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-stack-overflow.svg b/branch-3.9/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.9/_static/img/icons/icon-summit.svg b/branch-3.9/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-support.svg b/branch-3.9/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.9/_static/img/icons/icon-tech-talks.svg b/branch-3.9/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.9/_static/img/icons/icon-testing.svg b/branch-3.9/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.9/_static/img/icons/icon-thumbs-down.svg b/branch-3.9/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-thumbs-up.svg b/branch-3.9/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-tip.svg b/branch-3.9/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.9/_static/img/icons/icon-training.svg b/branch-3.9/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.9/_static/img/icons/icon-triangle-down.svg b/branch-3.9/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.9/_static/img/icons/icon-university.svg b/branch-3.9/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.9/_static/img/icons/icon-users-blog.svg b/branch-3.9/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.9/_static/img/icons/icon-warning.svg b/branch-3.9/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-webinars.svg b/branch-3.9/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.9/_static/img/icons/icon-whitepapers.svg b/branch-3.9/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.9/_static/img/icons/icon-workshop.svg b/branch-3.9/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/logo-docs.svg b/branch-3.9/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.9/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.9/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.9/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.9/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.9/_static/img/mascots/404.jpg b/branch-3.9/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.9/_static/img/mascots/404.jpg differ diff --git a/branch-3.9/_static/img/mascots/scylla-3monsters.png b/branch-3.9/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.9/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-alternator.svg b/branch-3.9/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.9/_static/img/mascots/scylla-cloud.svg b/branch-3.9/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.9/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.9/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-computer-headset.png b/branch-3.9/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-cup-number-one.png b/branch-3.9/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-docs.svg b/branch-3.9/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.9/_static/img/mascots/scylla-drivers.svg b/branch-3.9/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.9/_static/img/mascots/scylla-enterprise.svg b/branch-3.9/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.9/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.9/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-forklift-migration.png b/branch-3.9/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-gear.png b/branch-3.9/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-hardhat.png b/branch-3.9/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-headband.png b/branch-3.9/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-headset.png b/branch-3.9/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-hearts.png b/branch-3.9/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-looking-down.png b/branch-3.9/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-looking-up.png b/branch-3.9/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.9/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.9/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-manager.svg b/branch-3.9/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.9/_static/img/mascots/scylla-monitor.svg b/branch-3.9/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.9/_static/img/mascots/scylla-movement-fast.png b/branch-3.9/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-movement.png b/branch-3.9/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-onpremise.png b/branch-3.9/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-opensource.svg b/branch-3.9/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.9/_static/img/mascots/scylla-operator.svg b/branch-3.9/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.9/_static/img/mascots/scylla-plugin.png b/branch-3.9/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-release-mascot.png b/branch-3.9/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-repair.png b/branch-3.9/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-server.png b/branch-3.9/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-sleeping.png b/branch-3.9/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-tall-measure.png b/branch-3.9/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-university.png b/branch-3.9/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-weights.png b/branch-3.9/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-window-cleaning.png b/branch-3.9/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-with-computer-2.png b/branch-3.9/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-with-computer.png b/branch-3.9/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-with-linux.png b/branch-3.9/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-writting.png b/branch-3.9/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.9/_static/img/menu.svg b/branch-3.9/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.9/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.9/_static/img/scylla-monitor.png b/branch-3.9/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.9/_static/img/scylla-monitor.png differ diff --git a/branch-3.9/_static/js/main.bundle.js b/branch-3.9/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-3.9/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
              • Back
              • ',backButtonPosition:"top",wrapper:"
                ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                  "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                  ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                  ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                  ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                  ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                  "],col:[2,"","
                  "],tr:[2,"","
                  "],td:[3,"","
                  "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + + + +
                  + + + + + +
                  + + +
                  + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/index.html b/branch-3.9/index.html new file mode 100644 index 000000000..3495f5b15 --- /dev/null +++ b/branch-3.9/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack

                  +
                  +
                  +

                  Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                  +_images/monitor.png +

                  The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

                  +
                    +
                  • prometheus - collects and stores metrics

                  • +
                  • alertmanager - handles alerts

                  • +
                  • grafana - dashboard server

                  • +
                  +

                  Choose a topic to get started:

                  + +

                  For older versions of Scylla Monitoring Stack Documentation see here.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/docker_compose.html b/branch-3.9/install/docker_compose.html new file mode 100644 index 000000000..d93fb79e3 --- /dev/null +++ b/branch-3.9/install/docker_compose.html @@ -0,0 +1,814 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Using Docker Compose

                  +

                  Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                  +

                  Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                  +
                  +

                  Warning

                  +

                  docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                  +
                  +
                  +

                  Prerequisite

                  +

                  Make sure you have docker and docker-compose installed.

                  +
                  +
                  +

                  Setting Prometheus

                  +

                  The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                  +

                  You can use ./prometheus-config.sh to generate the file, for example:

                  +
                  ./prometheus-config.sh --compose
                  +
                  +
                  +

                  For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                  +
                  +
                  +

                  Setting Grafana Provisioning

                  +

                  Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                  +
                  +

                  Grafana Data-Source file

                  +

                  Run the following command to update the datasource:

                  +
                  ./grafana-datasource.sh --compose
                  +
                  +
                  +

                  You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                  +
                  +
                  +

                  Grafana Dashboard Load file

                  +

                  To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                  +
                  ./generate-dashboards.sh -t -v 2020.1
                  +
                  +
                  +

                  This command generates the files under: grafana/provisioning/dashboards/

                  +
                  +
                  +
                  +

                  Docker Compose file

                  +

                  You can use the following example as a base for your docker compose.

                  +

                  Pass the following to a file called docker-compose.yml

                  +
                  services:
                  +  alertmanager:
                  +    container_name: aalert
                  +    image: prom/alertmanager:v0.21.0
                  +    ports:
                  +    - 9093:9093
                  +    volumes:
                  +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                  +  grafana:
                  +    container_name: agraf
                  +    environment:
                  +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                  +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                  +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                  +    # This is where you set Grafana security
                  +    - GF_AUTH_BASIC_ENABLED=false
                  +    - GF_AUTH_ANONYMOUS_ENABLED=true
                  +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                  +    - GF_SECURITY_ADMIN_PASSWORD=admin
                  +    image: grafana/grafana:7.3.5
                  +    ports:
                  +    - 3000:3000
                  +    user: 1000:1000
                  +    volumes:
                  +    - ./grafana/build:/var/lib/grafana/dashboards
                  +    - ./grafana/plugins:/var/lib/grafana/plugins
                  +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                  +    # Uncomment the following line for grafana persistency
                  +    # - path/to/grafana/dir:/var/lib/grafana
                  +  loki:
                  +    command:
                  +    - --config.file=/mnt/config/loki-config.yaml
                  +    container_name: loki
                  +    image: grafana/loki:2.0.0
                  +    ports:
                  +    - 3100:3100
                  +    volumes:
                  +    - ./loki/rules:/etc/loki/rules
                  +    - ./loki/conf:/mnt/config
                  +  promotheus:
                  +    command:
                  +    - --config.file=/etc/prometheus/prometheus.compose.yml
                  +    container_name: aprom
                  +    image: prom/prometheus:v2.18.1
                  +    ports:
                  +    - 9090:9090
                  +    volumes:
                  +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                  +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                  +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                  +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                  +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                  +    # Uncomment the following line for prometheus persistency 
                  +    # - path/to/data/dir:/prometheus/data
                  +  promtail:
                  +    command:
                  +    - --config.file=/etc/promtail/config.yml
                  +    container_name: promtail
                  +    image: grafana/promtail:2.0.0
                  +    ports:
                  +    - 1514:1514
                  +    - 9080:9080
                  +    volumes:
                  +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                  +version: '3'
                  +
                  +
                  +
                  +

                  Start and Stop

                  +

                  To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                  +
                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/index.html b/branch-3.9/install/index.html new file mode 100644 index 000000000..98ec32b02 --- /dev/null +++ b/branch-3.9/install/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Download and Install Scylla Monitoring Stack

                  +
                  +
                  +

                  Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                  +

                  Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/min-prod-hw.html b/branch-3.9/install/min-prod-hw.html new file mode 100644 index 000000000..f501897fe --- /dev/null +++ b/branch-3.9/install/min-prod-hw.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Minimal Production System Recommendations

                  +
                    +
                  • CPU - at least 2 physical cores/ 4vCPUs

                  • +
                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                  • +
                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                  • +
                  • Network - 1GbE/10GbE preferred

                  • +
                  +
                  +

                  Calculating Prometheus Minimal Disk Space requirement

                  +

                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                  +

                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                  +

                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                  +
                  6 * 16 * 15 * 12MB ~ 16GB
                  +
                  +
                  +

                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                  +
                  +
                  +

                  Calculating Prometheus Minimal Memory Space requirement

                  +

                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                  +

                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/monitor_without_docker.html b/branch-3.9/install/monitor_without_docker.html new file mode 100644 index 000000000..ba893f83e --- /dev/null +++ b/branch-3.9/install/monitor_without_docker.html @@ -0,0 +1,1065 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Deploying Scylla Monitoring Stack Without Docker

                  +
                  +

                  Introduction

                  +

                  The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                  +

                  Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                  +

                  Scylla Monitoring uses the following components:

                  +
                    +
                  • Alertmanager

                  • +
                  • Grafana Loki

                  • +
                  • Prometheus

                  • +
                  • Grafana

                  • +
                  +

                  The common scenario for users who use their own standalone installation, is they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                  +

                  We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                  +
                  +
                  +

                  Minimal Production System Recommendations

                  +
                    +
                  • CPU - at least 2 physical cores/ 4vCPUs

                  • +
                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                  • +
                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                  • +
                  • Network - 1GbE/10GbE preferred

                  • +
                  +
                  +

                  Calculating Prometheus Minimal Disk Space requirement

                  +

                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                  +

                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                  +

                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                  +
                  6 * 16 * 15 * 12MB ~ 16GB
                  +
                  +
                  +

                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                  +
                  +
                  +

                  Calculating Prometheus Minimal Memory Space requirement

                  +

                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                  +

                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                  +

                  The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                  +
                  +

                  Note

                  +

                  Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                  +
                  +
                  +
                  +
                  +

                  Install Scylla Monitoring Stack

                  +

                  The following procedure uses a CentOS 7 based instance

                  +
                    +
                  1. Download the latest Scylla Monitoring Stack release.

                  2. +
                  +

                  wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-3.9.0.tar.gz

                  +
                    +
                  1. Open the tar

                  2. +
                  +

                  tar -xvf scylla-monitoring-*.tar.gz

                  +
                  +
                  +

                  Install Alertmanager

                  +

                  Tested with alertmanager 0.22.2 version

                  +
                    +
                  1. Install alertmanager

                  2. +
                  +
                  wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                  +tar -xvf alertmanager-*.linux-amd64.tar.gz
                  +
                  +
                  +
                    +
                  1. Copy the following file: rule_config.yml from scylla-monitoring-scylla-monitoring-3.9.0/prometheus directory to alertmanager.yml in the alertmanager installation directory.

                  2. +
                  +

                  For example:

                  +
                  cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.9.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                  +
                  +
                  +
                    +
                  1. Start the Alertmanager

                  2. +
                  +

                  For example:

                  +
                  cd alertmanager-0.22.2.linux-amd64
                  +./alertmanager
                  +
                  +
                  +
                    +
                  1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                  2. +
                  +

                  For example:

                  +
                  http://192.168.135.166:9093/
                  +
                  +
                  +../_images/alertmanager.png +
                  +
                  +

                  Install Grafana Loki

                  +

                  Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                  +

                  We recomand using Loki with containers, but you can install it locally as described in Loki installation

                  +

                  You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                  +

                  Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                  +

                  Loki Related files

                  +

                  Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                  +
                  mkdir -p /etc/loki/rules
                  +mkdir -p /etc/loki/config
                  +cp loki/rules/* /etc/loki/rules
                  +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                  +
                  +
                  +

                  Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                  +

                  Promtail Related files

                  +

                  Promtail has a configuration file. You need to copy and modify the configuration.

                  +
                  mkdir -p /etc/promtail/
                  +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                  +
                  +
                  +

                  Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                  +
                  +
                  +

                  Install Prometheus

                  +

                  Tested with Prometheus version 2.27.1

                  +
                  +

                  Note

                  +

                  If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                  +
                  +
                    +
                  1. Install Prometheus

                  2. +
                  +
                  wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                  +tar -xvf prometheus-*.linux-amd64.tar.gz
                  +
                  +
                  +

                  2. Create Data and Config directories +.. code-block:: shell

                  +
                  +

                  mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                  +
                  +
                    +
                  1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from scylla-monitoring-scylla-monitoring-3.9.0/prometheus directory to Prometheus installation directory.

                  2. +
                  +

                  Copy prometheus/prometheus.yml.template to prometheus.yml

                  +

                  For example:

                  +
                  cp scylla-monitoring-scylla-monitoring-3.9.0/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/
                  +cp scylla-monitoring-scylla-monitoring-3.9.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                  +
                  +
                  +
                    +
                  1. Edit the prometheus.yml file to point to the correct static data sources.

                  2. +
                  +
                  +

                  Note

                  +

                  Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                  +
                  +
                  vi /etc/prometheus/prometheus.yml
                  +
                  +
                  +

                  Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                  +

                  For example if the alertmanager will run on the same host:

                  +
                  alerting:
                  +   alertmanagers:
                  +   - static_configs:
                  +       - targets:
                  +           - 127.0.0.1:9093
                  +
                  +
                  +

                  Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                  +

                  For example the scrape config for Scylla:

                  +
                  global:
                  +  scrape_interval: 5s # By default, scrape targets every 5 second.
                  +  scrape_timeout: 4s # Timeout before trying to scape a target again
                  +
                  +  # Attach these labels to any time series or alerts when communicating with
                  +  # external systems (federation, remote storage, Alertmanager).
                  +  external_labels:
                  +    monitor: 'scylla-monitor'
                  +
                  +scrape_configs:
                  +- job_name: scylla
                  +  honor_labels: false
                  +  file_sd_configs:
                  +    - files:
                  +      - /etc/scylla.d/prometheus/scylla_servers.yml
                  +  relabel_configs:
                  +    - source_labels: [__address__]
                  +      regex:  '([^:]+)'
                  +      target_label: __address__
                  +      replacement: '${1}:9180'
                  +
                  +    - source_labels: [__address__]
                  +      regex:  '(.*):.+'
                  +      target_label: instance
                  +      replacement: '${1}'
                  +
                  +
                  +
                    +
                  1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                  2. +
                  +
                  +

                  Note

                  +

                  There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                  +
                  +

                  An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                  +
                  +

                  Note

                  +

                  You must have both files even if you are not using Scylla Manager

                  +
                  +

                  Add the labels for the cluster and data-center

                  +

                  scylla_servers.yml:

                  +

                  For example:

                  +
                  cat scylla_servers.yml
                  +# List Scylla end points
                  +
                  +- targets:
                  +  - 192.168.66.6
                  +  - 192.168.66.244
                  +  labels:
                  +    cluster: cluster1
                  +    dc: dc1
                  +- targets:
                  +    - 172.17.0.3
                  +  labels:
                  +    cluster: cluster1
                  +    dc: dc2
                  +
                  +
                  +
                  +

                  Note

                  +

                  See the previous note about deprecating the node_exporter_servers.yml file.

                  +
                  +

                  scylla_manager_server.yml

                  +

                  For example:

                  +
                  - targets:
                  +  - 127.0.0.1:5090
                  +
                  +
                  +
                    +
                  1. Start Prometheus server:

                  2. +
                  +

                  For example:

                  +
                  cd scylla-monitoring-scylla-monitoring-3.9.0/
                  +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                  +
                  +
                  +

                  Data should start accumulate on: /prometheus/data

                  +
                    +
                  1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                  2. +
                  +

                  For example:

                  +
                  http://192.168.135.166:9090/
                  +
                  +
                  +../_images/1.png +

                  Prometheus console should be visible

                  +
                    +
                  1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                  2. +
                  +

                  For example:

                  +

                  node_memory_MemFree

                  +../_images/2.png +

                  And

                  +

                  scylla_reactor_utilization

                  +../_images/3.png +

                  At this point Scylla is emitting the metrics and Prometheus is able to store them.

                  +
                  +
                  +

                  Install Grafana

                  +

                  Tested with Grafna 7.5.7

                  +
                    +
                  1. Install Grafana based on the instructions here

                  2. +
                  +

                  Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                  +
                    +
                  1. Access Scylla-Grafana-monitoring directory

                  2. +
                  +

                  cd scylla-monitoring-scylla-monitoring-3.9.0/

                  +
                    +
                  1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                  2. +
                  +
                  sudo cp -r grafana/plugins /var/lib/grafana/
                  +
                  +
                  +

                  If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                  +

                  For example:

                  +
                  cp -r grafana/plugins ../grafana-7.5.7/public/app
                  +
                  +
                  +
                    +
                  1. Provision the Dashboards

                  2. +
                  +

                  For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                  +

                  For Grafana installed with yum install

                  +
                  sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                  +sudo mkdir -p /var/lib/grafana/dashboards
                  +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                  +
                  +
                  +

                  For Grafana installed from packages

                  +
                  cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                  +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                  +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                  +
                  +
                  +

                  Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                  +
                  +

                  Note

                  +

                  A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                  +
                  +
                    +
                  1. Set the data source by copy datasource.yml and edit it

                  2. +
                  +
                  sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                  +
                  +
                  +

                  For Grafana installed from packages

                  +
                  cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                  +
                  +
                  +

                  You should set the Prometheus and the alertmanager IP and port.

                  +

                  For example

                  +
                  sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                  +apiVersion: 1
                  +datasources:
                  + - name: prometheus
                  +   type: prometheus
                  +   url: http://192.168.135.167:9090
                  +   access: proxy
                  +   basicAuth: false
                  +
                  + - name: alertmanager
                  +   type: camptocamp-prometheus-alertmanager-datasource
                  +   orgId: 1
                  +   typeLogoUrl: public/img/icn-datasource.svg
                  +   access: proxy
                  +   url: http://192.168.135.166:9093
                  +   password:
                  +   user:
                  +   database:
                  +   basicAuth:
                  +   isDefault:
                  +   jsonData:
                  +     severity_critical: '4'
                  +     severity_high: '3'
                  +     severity_warning: '2'
                  +     severity_info: '1'
                  +
                  +
                  +
                    +
                  1. Start the Grafana service

                  2. +
                  +

                  For Grafana installed with yum install

                  +

                  sudo service grafana-server start

                  +

                  For Grafana installed from packages:

                  +

                  cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                  +

                  Edit scylla.ini to reflect the right paths in the paths section of the file.

                  +
                  plugins = /home/centos/grafana-7.5.7/data/plugins
                  +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                  +
                  +
                  +

                  Start the server:

                  +
                  cd /home/centos/grafana-7.5.7/
                  +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                  +
                  +
                  +
                    +
                  1. Make sure Grafana is running

                  2. +
                  +

                  Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                  +../_images/grafana.png +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/monitoring_stack.html b/branch-3.9/install/monitoring_stack.html new file mode 100644 index 000000000..4c0bb81f6 --- /dev/null +++ b/branch-3.9/install/monitoring_stack.html @@ -0,0 +1,1054 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Install Scylla Monitoring Stack

                  + +

                  This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API.

                  +

                  The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                  +

                  For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                  +
                  +

                  Minimal Production System Recommendations

                  +
                    +
                  • CPU - at least 2 physical cores/ 4vCPUs

                  • +
                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                  • +
                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                  • +
                  • Network - 1GbE/10GbE preferred

                  • +
                  +
                  +

                  Calculating Prometheus Minimal Disk Space requirement

                  +

                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                  +

                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                  +

                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                  +
                  6 * 16 * 15 * 12MB ~ 16GB
                  +
                  +
                  +

                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                  +
                  +
                  +

                  Calculating Prometheus Minimal Memory Space requirement

                  +

                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                  +

                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                  +
                  +
                  +
                  +

                  Prerequisites

                  +
                    +
                  • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker .

                  • +
                  • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                  • +
                  + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  Scylla Monitoring Stack Compatibility Matrix

                  Scylla Monitoring Stack Version

                  Prometheus Version

                  Grafana Version

                  3.9

                  2.29.1

                  8.1.1

                  3.8

                  2.27.1

                  7.5.7

                  3.7

                  2.25.2

                  7.4.0

                  3.6

                  2.18.1

                  7.3.5

                  3.5

                  2.18.1

                  7.1.5

                  3.4

                  2.18.1

                  6.7.3

                  +
                  +
                  +

                  Docker Post Installation

                  +

                  Docker post installation guide can be found here

                  +
                  +

                  Note

                  +

                  Avoid running the container as root.

                  +
                  +

                  To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                  +
                    +
                  1. Create the Docker group.

                  2. +
                  +
                  sudo groupadd docker
                  +
                  +
                  +
                    +
                  1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                  2. +
                  +
                  sudo usermod -aG docker $USER
                  +
                  +
                  +
                    +
                  1. Start Docker by calling:

                  2. +
                  +
                  sudo systemctl enable docker
                  +
                  +
                  +
                  +
                  +

                  Install Scylla Monitoring Stack

                  +

                  Procedure

                  +
                    +
                  1. Download and extract the latest Scylla Monitoring Stack binary;.

                  2. +
                  +
                  wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.9.2.tar.gz
                  +tar -xvf scylla-monitoring-3.9.2.tar.gz
                  +cd scylla-monitoring-scylla-monitoring-3.9.2
                  +
                  +
                  +

                  As an alternative, you can clone and use the Git repository directly.

                  +
                  git clone https://github.com/scylladb/scylla-monitoring.git
                  +cd scylla-monitoring
                  +git checkout branch-3.9
                  +
                  +
                  +
                    +
                  1. Start Docker service if needed

                  2. +
                  +
                  sudo systemctl restart docker
                  +
                  +
                  +
                  +
                  +

                  Configure Scylla Monitoring Stack

                  +

                  To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                  +

                  This configuration can be done from files, or using the Consul api.

                  +

                  Scylla Manager 2.0 and higher supports the Consul API.

                  +
                  +

                  Configure Scylla nodes from files

                  +
                    +
                  1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                  2. +
                  +
                  +

                  Note

                  +

                  It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                  +
                  +

                  For example:

                  +
                  - targets:
                  +      - 172.17.0.2
                  +      - 172.17.0.3
                  +  labels:
                  +      cluster: cluster1
                  +      dc: dc1
                  +
                  +
                  +
                  +

                  Note

                  +

                  If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                  +
                  +

                  Using IPV6

                  +

                  To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                  +

                  For example:

                  +
                  - targets:
                  +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                  +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                  +  labels:
                  +      cluster: cluster1
                  +      dc: dc1
                  +
                  +
                  +
                  +

                  Note

                  +

                  For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                  +
                  +

                  For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                  +
                  +

                  Note

                  +

                  By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                  +
                  +

                  If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                  +

                  For example:

                  +
                  ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                  +
                  +
                  +

                  Mark the different Data Centers with Labels.

                  +

                  As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                  +

                  You can use the genconfig.py script to generate the server file. For example:

                  +
                  ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                  +
                  +
                  +

                  This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                  +

                  OR

                  +

                  The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                  +
                  nodetool status | ./genconfig.py -NS
                  +
                  +
                  +

                  2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                  +

                  You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                  +

                  For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                  +
                  # List Scylla Manager end points
                  +
                  +- targets:
                  +  - 172.17.0.7:5090
                  +
                  +
                  +

                  Note that you do not need to add labels to the Scylla Manager targets.

                  +
                  +
                  +

                  Configure Scylla nodes using Scylla-Manager Consul API

                  +

                  Scylla Manager 2.0 has a Consul like API.

                  +

                  When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                  +

                  For example:

                  +
                  ./start-all.sh -L 10.10.0.1
                  +
                  +
                  +
                  +

                  Note

                  +

                  If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                  +
                  +
                  +
                  +

                  Connecting Scylla-Monitoring to Scylla

                  +

                  Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                  +

                  You can limit the user to read only, currently it only read table from the system keyspace.

                  +

                  To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

                  +

                  Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

                  +
                  +
                  +

                  Use an external directory for the Prometheus data directory

                  +

                  The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                  +
                  +

                  Note

                  +

                  Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                  +
                  +

                  If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                  +

                  In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                  +
                  +
                  +

                  Add Additional Prometheus Targets

                  +

                  There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                  +

                  The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                  +

                  You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                  +
                  - job_name: 'myservice'
                  +  # Override the global default and scrape targets from this job every 5 seconds.
                  +  scrape_interval: 5s
                  +  static_configs:
                  +    - targets:
                  +      - 17.0.0.1:7000
                  +
                  +
                  +
                  +
                  +
                  +

                  Start and Stop Scylla Monitoring Stack

                  +
                  +

                  Start

                  +
                  ./start-all.sh -d prometheus_data
                  +
                  +
                  +
                  +
                  +

                  Stop

                  +
                  ./kill-all.sh
                  +
                  +
                  +
                  +
                  +

                  Start a Specific Scylla Monitoring Stack Version

                  +

                  By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                  +

                  You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                  +

                  Multiple versions are supported. For example:

                  +
                  ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                  +
                  +
                  +

                  will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                  +
                  +
                  +

                  Accessing the localhost

                  +

                  The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                  +
                  ./start-all.sh -l -d prometheus-data
                  +
                  +
                  +
                  +
                  +

                  Configure rsyslog on each Scylla node

                  +

                  generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                  +

                  Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                  +

                  Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                  +

                  If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                  +
                  if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                  +
                  +
                  +

                  Restart rsyslog for the configuration to take effect.

                  +
                  systemctl restart rsyslog
                  +
                  +
                  +
                  +
                  +
                  +

                  View Grafana Dashboards

                  +

                  Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/start_all.html b/branch-3.9/install/start_all.html new file mode 100644 index 000000000..8099cbfcf --- /dev/null +++ b/branch-3.9/install/start_all.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  The start-all.sh command

                  +

                  Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

                  +

                  The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                  +
                  +

                  General Options

                  +

                  -h Help, Print the help, and exit.

                  +

                  –version print the current Scylla-Monitoring stack version, and exit.

                  +

                  -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

                  +

                  -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                  +

                  -D encapsulate docker param Allows passing additional parameters to all the docker containers.

                  +

                  –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                  +
                  + + +
                  +

                  Alert Manager

                  +

                  alertmanager handles the alerts and takes the following parameters:

                  +

                  -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                  +

                  -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                  +

                  -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/thanos.html b/branch-3.9/install/thanos.html new file mode 100644 index 000000000..da56e96ce --- /dev/null +++ b/branch-3.9/install/thanos.html @@ -0,0 +1,757 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Using Thanos as Data Source With Scylla Monitoring Stack

                  +

                  Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as:

                  +
                    +
                  • High-availability.

                  • +
                  • Horizontal scaling.

                  • +
                  • Backup.

                  • +
                  +

                  The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                  +

                  The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                  +
                  +

                  Using Thanos As a Prometheus Aggregator

                  +

                  There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                  +
                  +

                  Prometheus Configuration

                  +

                  We will assume you have two Prometheus servers running.

                  +
                    +
                  1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                  2. +
                  3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                  4. +
                  +
                  +
                  +

                  Thanos sidecar

                  +

                  The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                  +
                  docker run -d \
                  + -v /path/to/prom/dir:/data/prom:z \
                  + -i --name sidecar thanosio/thanos \
                  + sidecar \
                  + --grpc-address=0.0.0.0:10911 \
                  + --grpc-grace-period=1s \
                  + --http-address=0.0.0.0:10912 \
                  + --http-grace-period=1s \
                  + --prometheus.url=http://prometheus-ip:9090 \
                  + --tsdb.path=/data/prom \
                  + -p 10912:10912 \
                  + -p 10911:10911
                  +
                  +
                  +

                  After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                  +
                  +
                  +

                  Thanos query

                  +

                  Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                  +
                  docker run -d \
                  + --name thanos -- thanosio/thanos \
                  +   query \
                  +   --debug.name=query0 \
                  +   --log.level=debug \
                  +   --grpc-address=0.0.0.0:10903 \
                  +   --grpc-grace-period=1s \
                  +   --http-address=0.0.0.0:10904 \
                  +   --http-grace-period=1s \
                  +   --query.replica-label=prometheus \
                  +   --store={ip1}:10911 --store={ip2}:10911
                  +
                  +
                  +

                  After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                  +
                  +
                  +

                  Update Scylla Data source

                  +

                  The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                  +

                  The file you edit is a template file that replaces the file Grafana uses, next time you start.

                  +

                  Restart the Scylla Monitoring Stack it should now use Thanos.

                  +
                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/intro.html b/branch-3.9/intro.html new file mode 100644 index 000000000..3980e6c38 --- /dev/null +++ b/branch-3.9/intro.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack

                  +

                  Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                  +_images/monitor.png +

                  The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers:

                  +
                    +
                  • prometheus - Collects and stores metrics

                  • +
                  • grafan-loki - Parses logs and generates metrics and alerts

                  • +
                  • alertmanager - Handles alerts

                  • +
                  • grafana - Dashboards server

                  • +
                  +

                  A few optional components are used for additional services

                  +
                    +
                  • grafana-image-renderer - Allows you to download a dashboard as an image.

                  • +
                  • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                  • +
                  +
                  +

                  High Level Architecture

                  +_images/monitoring_stack.png +

                  We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the node_exporter agent that runs on the Scylla server.

                  +

                  We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers.

                  +

                  The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                  +

                  We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL.

                  +

                  Choose a topic to get started:

                  + +

                  For older versions of Scylla Monitoring Stack Documentation see here.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/objects.inv b/branch-3.9/objects.inv new file mode 100644 index 000000000..0bb5ab67a Binary files /dev/null and b/branch-3.9/objects.inv differ diff --git a/branch-3.9/procedures/alerts/alerting.html b/branch-3.9/procedures/alerts/alerting.html new file mode 100644 index 000000000..7ef8009c7 --- /dev/null +++ b/branch-3.9/procedures/alerts/alerting.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Alerting

                  +

                  Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                  +

                  You can read more about Prometheus alerting here

                  +

                  By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                  +

                  In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                  +

                  The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                  +../../_images/monitoring_stack1.png +
                  +

                  Prometheus Alerts

                  +

                  The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                  +

                  Each alert consists of:

                  +
                    +
                  • Name

                  • +
                  • What happened

                  • +
                  • For how long

                  • +
                  • What to report

                  • +
                  +

                  For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                  +
                  - alert: InstanceDown
                  +  expr: up == 0
                  +  for: 60s
                  +  labels:
                  +    severity: "2"
                  +  annotations:
                  +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                  +    summary: Instance {{ $labels.instance }} down
                  +
                  +
                  +

                  The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                  +

                  The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                  +

                  The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                  +

                  annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                  +
                  +
                  +

                  Alertmanager

                  +

                  The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                  +

                  The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                  +
                    +
                  • Routes: Represent a routing tree, the most specific rule, wins

                  • +
                  • Inhibition: Mute an alert, based on another alert

                  • +
                  • Receiver: Send a notification via email, sluck, etc’

                  • +
                  +

                  Check the Alertmanager documentation for details on how to specify a specific receiver.

                  +

                  In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                  +
                  +
                  +

                  Tips When Adding an Alert

                  +

                  It’s worse having an alert that does not work, than not having an alert at all

                  +

                  There are multiple ways you can use to make sure your alert is set correctly:

                  +
                    +
                  • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                  • +
                  • Force the alert to be active by reducing the limits or the duration.

                  • +
                  • When possible simulate the actual scenario and see that the alert works as expected.

                  • +
                  +

                  For example, low available disk space.

                  +

                  Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                  +

                  Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                  +

                  Starting with a simple working expression helps you bisect problems.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/procedures/alerts/index.html b/branch-3.9/procedures/alerts/index.html new file mode 100644 index 000000000..94a82ba97 --- /dev/null +++ b/branch-3.9/procedures/alerts/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Alert Manager

                  +
                  +
                  +

                  Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/procedures/index.html b/branch-3.9/procedures/index.html new file mode 100644 index 000000000..3e7225f65 --- /dev/null +++ b/branch-3.9/procedures/index.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Procedures

                  +
                  +
                  +

                  There are several reference guides available which give additional information. Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/procedures/updating_dashboard.html b/branch-3.9/procedures/updating_dashboard.html new file mode 100644 index 000000000..42a2170af --- /dev/null +++ b/branch-3.9/procedures/updating_dashboard.html @@ -0,0 +1,963 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Adding and Modifying Dashboards

                  +

                  The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                  +

                  It will explain about Scylla Monitoring Stack dashboard templates and how to modify them.

                  + +
                  +

                  General Limitations

                  +

                  Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades.

                  +
                  +

                  consistency between restarts

                  +

                  By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana.

                  +
                  +
                  +

                  consistency between upgrades

                  +

                  As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                  +
                  +

                  Note

                  +

                   You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided.

                  +
                  +

                  At large, we suggest maintaining your dashboards as files, as Scylla Monitor does.

                  +
                  +
                  +
                  +

                  Using templated Dashboards

                  +

                  Why does Scylla Monitor use dashboard templates?

                  +

                  We found the Grafana dashboards Json format too verbose to be maintainable.

                  +

                  Each element in the dashboard file (Each Json object) contains all of its attributes and values.

                  +

                  For example a typical graph panel would look like:

                  +
                  {
                  +    "aliasColors": {},
                  +    "bars": false,
                  +    "datasource": "prometheus",
                  +    "editable": true,
                  +    "error": false,
                  +    "fill": 0,
                  +    "grid": {
                  +        "threshold1": null,
                  +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                  +        "threshold2": null,
                  +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                  +    },
                  +    "gridPos": {
                  +        "h": 6,
                  +        "w": 10,
                  +        "x": 0,
                  +        "y": 4
                  +    },
                  +    "id": 2,
                  +    "isNew": true,
                  +    "legend": {
                  +        "avg": false,
                  +        "current": false,
                  +        "max": false,
                  +        "min": false,
                  +        "show": false,
                  +        "total": false,
                  +        "values": false
                  +    },
                  +    "lines": true,
                  +    "linewidth": 2,
                  +    "links": [],
                  +    "nullPointMode": "connected",
                  +    "percentage": false,
                  +    "pointradius": 5,
                  +    "points": false,
                  +    "renderer": "flot",
                  +    "seriesOverrides": [
                  +        {}
                  +    ],
                  +    "span": 5,
                  +    "stack": false,
                  +    "steppedLine": false,
                  +    "targets": [
                  +        {
                  +            "expr": "sum(node_filesystem_avail) by (instance)",
                  +            "intervalFactor": 1,
                  +            "legendFormat": "",
                  +            "refId": "A",
                  +            "step": 1
                  +        }
                  +    ],
                  +    "timeFrom": null,
                  +    "timeShift": null,
                  +    "title": "Available Disk Size",
                  +    "tooltip": {
                  +        "msResolution": false,
                  +        "shared": true,
                  +        "sort": 0,
                  +        "value_type": "cumulative"
                  +    },
                  +    "transparent": false,
                  +    "type": "graph",
                  +    "xaxis": {
                  +        "show": true
                  +    },
                  +    "yaxes": [
                  +        {
                  +            "format": "percent",
                  +            "logBase": 1,
                  +            "max": 101,
                  +            "min": 0,
                  +            "show": true
                  +        },
                  +        {
                  +            "format": "short",
                  +            "logBase": 1,
                  +            "max": null,
                  +            "min": null,
                  +            "show": true
                  +        }
                  +    ]
                  +}
                  +
                  +
                  +

                  As you can imagine, most panels would have similar values.

                  +

                  To reduce the redundancy of Grafana JSON format, we added dashboard templates.

                  +
                  +

                  The template class system

                  +

                  Scylla Monitoring Stack dashboard templates use class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                  +

                  The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes.

                  +

                  In the template file, you can also add or override attributes.

                  +

                  The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                  +

                  When generating dashboards, each class will be replaced by its definition.

                  +

                  For example row in the type.json defined

                  +
                  {
                  + "base_row": {
                  +     "collapse": false,
                  +     "editable": true
                  + },
                  + "row": {
                  +     "class": "base_row",
                  +     "height": "250px"
                  + }
                  + }
                  +
                  +
                  +

                  In a Template it will be used like

                  +
                  {
                  +     "class": "row",
                  +     "height": "150px",
                  +     "panels": [
                  +     ]
                  +}
                  +
                  +
                  +

                  The output will be

                  +
                  {
                  +     "class": "row",
                  +     "collapse": false,
                  +     "editable": true,
                  +     "height": "150px",
                  +     "panels": [
                  +
                  +     ]
                  +}
                  +
                  +
                  +

                  We can see that the template added the panels attribute and override the height attribute.

                  +
                  +
                  +

                  Panel example

                  +

                  Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                  +
                  {
                  +     "class": "row",
                  +     "panels": [
                  +         {
                  +             "class": "bytes_panel",
                  +             "span": 3,
                  +             "targets": [
                  +                 {
                  +                     "expr": "sum(node_filesystem_avail) by (instance)",
                  +                     "intervalFactor": 1,
                  +                     "legendFormat": "",
                  +                     "metric": "",
                  +                     "refId": "A",
                  +                     "step": 1
                  +                 }
                  +             ],
                  +             "title": "Available Disk Size"
                  +         }
                  +     ]
                  +}
                  +
                  +
                  +

                  In the example, we used the bytes_panel class that generate a graph with bytes as units (that would mean that your +Y axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’)

                  +

                  You can also see that we override the span attribute to set the panel size.

                  +

                  To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                  +
                  +
                  +

                  Grafana Formats and Layouts

                  +

                  The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                  +

                  Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width).

                  +

                  The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                  +

                  To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                  +

                  The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                  +

                  you can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                  +

                  gridPos has the following attributes:

                  +
                  {
                  +   "x": 0,
                  +   "y": 0,
                  +   "w": 24,
                  +   "h": 4
                  + }
                  +
                  +
                  +

                  When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                  +
                  {
                  +   "gridPos": {
                  +      "h": 2
                  +    }
                  +}
                  +
                  +
                  +
                  +
                  +

                  Generating the dashboards from templates (generate-dashboards.sh)

                  +
                  +

                  Prerequisite

                  +

                  Python 2.7

                  +

                  make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                  +

                  Use the -h flag to get help information.

                  +

                  You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                  +

                  When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                  +

                  For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                  +

                  .\generate-dashboards.sh -v 2020.1

                  +
                  +

                  Note

                  +

                  generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard.

                  +
                  +
                  +
                  +
                  +

                  Validation

                  +

                  After making changes to a template, run the generate_generate-dashboards.sh you should see that it run without any errors.

                  +

                  Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                  +
                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/reference/index.html b/branch-3.9/reference/index.html new file mode 100644 index 000000000..69594a192 --- /dev/null +++ b/branch-3.9/reference/index.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Reference Guide

                  +
                  +
                  +

                  There are several reference guides available which give additional information. Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/reference/matrix.html b/branch-3.9/reference/matrix.html new file mode 100644 index 000000000..65078368e --- /dev/null +++ b/branch-3.9/reference/matrix.html @@ -0,0 +1,798 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Support Matrix

                  +

                  The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                  + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                  Scylla Monitoring Stack Version

                  Scylla Open Source Version

                  Scylla Enterprise Version

                  Node_exporter[1] Version

                  Scylla Manager Version

                  3.9

                  4.3, 4.4, 4.5, 4.6

                  2020.1, 2021.1

                  0.17

                  2.3, 2.4, 2.5

                  3.8

                  4.3, 4.4, 4.5

                  2020.1, 2021.1

                  0.17

                  2.3, 2.4, 2.5

                  3.7

                  4.2, 4.3, 4.4

                  2019.1, 2020.1, 2021.1

                  0.17

                  2.2, 2.3

                  3.6.3

                  4.2, 4.3, 4.4

                  2019.1, 2020.1, 2021.1

                  0.17

                  2.2, 2.3, 2.1

                  3.6

                  4.1, 4.2, 4.3

                  2019.1, 2020.1

                  0.17

                  2.1, 2.2, 2.3

                  3.6.1

                  4.1, 4.2, 4.3

                  2019.1, 2020.1

                  0.17

                  2.1, 2.2

                  3.6.1

                  4.1, 4.2, 4.3, 4.4

                  2019.1, 2020.1

                  0.17

                  2.1, 2.2

                  3.5

                  3.3, 4.0, 4.1, 4.2

                  2019.1, 2020.1

                  0.17

                  2.0, 2.1, 2.2

                  3.4.3

                  3.3, 4.0, 4.1, 4.2

                  2019.1, 2020.1

                  0.17

                  2.0, 2.1

                  3.4

                  3.3, 4.0, 4.1

                  2018.1, 2019.1

                  0.17

                  2.0, 2.1

                  3.3

                  3.1, 3.2, 3.3, 4.0

                  2018.1, 2019.1

                  0.17

                  1.4, 2.0, 2.1

                  3.2

                  3.1, 3.2, 3.3

                  2018.1, 2019.1

                  0.17

                  1.4, 2.0

                  3.1

                  2.3, 3.0, 3.1, 3.2

                  2018.1, 2019.1

                  0.17

                  1.3, 1.4, 2.0

                  3.0

                  2.3, 3.0, 3.1, 3.2

                  2018.1, 2019.1

                  0.17

                  1.3, 1.4

                  2.4

                  2.3, 3.0, 3.1

                  2018.1, 2019.1

                  0.14, 0.17

                  1.3, 1.4

                  2.3

                  2.3, 3.0

                  2018.1, 2019.1

                  0.14, 0.17

                  1.3

                  2.2

                  2.3, 3.0

                  2018.1, 2019.1

                  0.14, 0.17

                  1.3

                  2.1

                  2.3, 3.0

                  2018.1

                  0.14, 0.17

                  1.3

                  +

                  [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/reference/monitoring_apis.html b/branch-3.9/reference/monitoring_apis.html new file mode 100644 index 000000000..3e42e845b --- /dev/null +++ b/branch-3.9/reference/monitoring_apis.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Interfaces

                  +

                  Scylla exposes two interfaces for online monitoring, as described below

                  +
                  +

                  Prometheus

                  +

                  By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                  +

                  For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack

                  +

                  You can change the Prometheus listening address and port in scylla.yaml file

                  +
                  # prometheus port
                  +# By default, Scylla opens prometheus API port on port 9180
                  +# setting the port to 0 will disable the prometheus API.
                  +prometheus_port: 9180
                  +#
                  +# prometheus address
                  +# By default, Scylla binds all interfaces to the prometheus API
                  +# It is possible to restrict the listening address to a specific one
                  +prometheus_address: 0.0.0.0
                  +
                  +
                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/robots.txt b/branch-3.9/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.9/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.9/search.html b/branch-3.9/search.html new file mode 100644 index 000000000..18dfc3d90 --- /dev/null +++ b/branch-3.9/search.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + + + +
                  + + + + + +
                  + + +
                  + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/searchindex.js b/branch-3.9/searchindex.js new file mode 100644 index 000000000..04d18c7c0 --- /dev/null +++ b/branch-3.9/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "Scylla Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Scylla Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38], "9": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38], "scylla": [0, 2, 4, 7, 10, 13, 24, 25, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37], "monitor": [0, 2, 4, 7, 10, 13, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37], "stack": [0, 2, 4, 7, 10, 13, 21, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 18, 20, 22, 24, 25, 26, 27, 30, 31, 32, 34, 36, 37], "full": [0, 1, 3, 6, 9, 10, 24], "alert": [0, 1, 3, 5, 6, 9, 12], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 15, 18, 20, 22, 32, 34, 36], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 13, 20, 27, 36, 37], "open": [0, 1, 3, 5, 6, 9, 15, 16, 19], "sourc": [0, 1, 3, 5, 6, 9, 10, 15, 19, 20, 36], "tool": [0, 1, 3, 9, 18, 37], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 13, 15, 18, 21, 22, 23, 37], "grafana": [0, 1, 3, 8, 9, 10, 21, 23], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 12, 15, 18, 21, 22, 23, 31, 37, 38], "consist": [1, 9, 10, 20, 31], "three": [1, 6, 10], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 18, 20], "collect": [1, 5, 6, 7, 8, 9, 22, 32, 34], "store": [1, 5, 8, 9, 13, 21, 23, 25, 26, 36], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 13, 15, 20, 21, 22, 23, 37], "alertmanag": [1, 2, 7, 9, 21, 23], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 16, 20, 24, 37], "choos": [1, 3, 9, 11, 12, 14, 17, 18, 38], "topic": [1, 3, 9, 11, 12, 14, 17, 26, 38], "get": [1, 6, 8, 9, 10, 13, 25, 31, 35, 36, 37], "start": [1, 3, 5, 8, 9, 10, 13, 20, 21, 22, 23], "user": [1, 2, 5, 6, 7, 9, 24, 37], "guid": [1, 6, 9, 12, 18, 19], "download": [1, 5, 6, 9, 20, 21, 22, 23], "instal": [1, 2, 9, 18], "procedur": [1, 5, 6, 9, 18, 19], "troubleshoot": [1, 9, 30], "refer": [1, 6, 9, 12], "upgrad": [1, 12], "lesson": [1, 9, 26, 27], "univers": [1, 9], "github": [1, 5, 6, 21, 23], "project": 1, "For": [1, 2, 4, 5, 6, 7, 9, 10, 13, 16, 18, 20, 31, 32, 35, 37], "older": [1, 9, 22, 23], "version": [1, 2, 5, 7, 9, 13, 15, 18], "document": [1, 5, 6, 8, 9, 10, 13, 18, 20, 21, 22, 23], "see": [1, 2, 4, 5, 6, 9, 10, 13, 16, 18, 20, 21, 22, 23, 37], "here": [1, 5, 6, 7, 9, 10, 13, 20], "base": [2, 5, 6, 7, 8, 9, 10, 13, 24, 37], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 20, 21, 22, 23, 27, 29, 31, 37, 38], "can": [2, 5, 6, 7, 8, 10, 13, 16, 18, 20, 21, 22, 23, 24, 27, 31, 37, 38], "all": [2, 3, 5, 6, 8, 10, 13, 16, 18, 20, 22, 24, 28, 31, 37], "sh": [2, 3, 6, 18, 20, 21, 22, 23], "kill": [2, 6, 18, 20, 22], "script": [2, 3, 6, 7, 13, 22], "an": [2, 4, 5, 7, 8, 9, 13, 18, 20, 22, 29, 30, 31, 32, 34, 36, 37], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 13, 16, 20], "requir": [2, 8, 25, 28, 32, 37], "more": [2, 4, 5, 6, 10, 13, 16, 18, 24, 27, 30, 32, 35, 37], "manual": [2, 18], "step": [2, 5, 8, 13, 18, 20, 21, 22, 23], "onc": [2, 20, 29, 36, 37], "configur": [2, 5, 7, 10, 13, 16, 18, 20, 31], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 20, 21, 22, 23, 31, 32, 33, 36, 37, 38], "two": [2, 6, 7, 8, 16, 20, 23, 31, 36, 37], "wai": [2, 5, 7, 10, 18, 30, 37], "launch": 2, "should": [2, 4, 5, 6, 8, 13, 18, 20, 22, 23, 24, 25, 28, 29, 30, 35, 37], "one": [2, 6, 7, 16, 20, 21, 22, 23, 25, 27, 28, 31, 32, 37], "both": [2, 5, 6, 18, 21, 23, 37], "In": [2, 6, 10, 13, 18, 20, 37], "particular": 2, "creat": [2, 5, 6, 7, 10, 13, 18, 24, 36, 37], "updat": [2, 5, 13, 18, 20], "yml": [2, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 37], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 13, 18, 20, 21, 23, 26, 31, 32, 37], "make": [2, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 31, 37], "sure": [2, 5, 6, 8, 10, 13, 18, 20, 21, 22, 23, 37], "have": [2, 4, 5, 6, 7, 8, 10, 13, 18, 23], "among": [2, 31], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 16, 18, 20, 21, 23], "address": [2, 5, 6, 7, 8, 16, 18, 20], "either": [2, 6], "locat": [2, 7, 10, 20, 22, 31], "scylla_serv": [2, 5, 6, 18, 20, 21, 22, 23, 37], "consul": [2, 7], "manag": [2, 5, 12, 15, 17], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 37], "exampl": [2, 4, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 31, 32, 37], "product": [2, 7], "system": [2, 7, 9, 10, 11, 21, 23, 25, 31, 37], "advis": [2, 31], "extern": [2, 5, 7, 8, 10, 13, 18, 21, 23, 37], "directori": [2, 5, 7, 8, 10, 13, 20, 21, 22, 23], "databas": [2, 5, 7, 20, 27, 37], "accordingli": 2, "below": [2, 6, 10, 16], "read": [2, 6, 8, 9, 10, 18, 20, 24, 28], "its": [2, 6, 7, 8, 9, 13, 20], "from": [2, 5, 7, 8, 9, 10, 18, 20, 21, 22, 23, 24, 30, 33, 37], "note": [2, 5, 6, 7, 18, 20, 21, 23], "latter": 2, "tell": 2, "where": [2, 5, 6, 13, 18, 20, 37], "themselv": [2, 13], "which": [2, 8, 12, 13, 14, 15, 30, 32, 34, 36, 37], "differ": [2, 5, 6, 7, 8, 13, 20, 21, 22, 23, 29, 30, 37], "run": [2, 3, 5, 6, 7, 8, 9, 13, 15, 18, 20, 22], "follow": [2, 4, 5, 6, 7, 13, 15, 18, 20, 21, 23, 37], "command": [2, 6, 8, 18, 20, 21, 23], "datasourc": [2, 5, 6, 8, 13], "under": [2, 5, 6], "yaml": [2, 5, 6, 16], "To": [2, 4, 5, 6, 13, 16, 20, 21, 22, 23], "sashboard": 2, "t": [2, 13], "line": [2, 6, 7, 8, 13, 20], "flag": [2, 6, 7, 8, 13, 18, 20, 21, 23], "v": [2, 6, 7, 8, 13, 18], "specifi": [2, 6, 7, 10, 13, 18, 20], "enterpris": [2, 6, 13, 15], "2020": [2, 6, 13, 15], "1": [2, 5, 6, 7, 8, 13, 15, 19, 21, 23], "thi": [2, 4, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 24, 25, 28, 31, 33, 37], "your": [2, 5, 6, 7, 8, 10, 11, 13, 16, 18, 20, 21, 23, 25, 26, 27, 37], "pass": [2, 6, 7, 20], "call": [2, 6, 7], "servic": [2, 5, 6, 7, 9, 18], "container_nam": 2, "aalert": 2, "imag": [2, 9, 18], "prom": [2, 8, 18], "v0": [2, 5], "21": 2, "0": [2, 5, 6, 7, 8, 10, 13, 15, 16, 20, 21, 22, 23], "port": [2, 5, 6, 7, 16, 18, 20, 21, 23], "9093": [2, 5], "volum": [2, 4, 5, 6, 21, 23], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 13], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 13, 22], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "scylladb": [2, 5, 6, 21, 23, 26, 27, 28, 30, 32, 34, 35], "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 13], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 13, 15], "5": [2, 5, 6, 13, 15, 18], "3000": [2, 5, 6, 21, 23], "1000": 2, "build": [2, 5], "plugin": [2, 5], "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 26, 32, 34, 37], "path": [2, 5, 6, 7, 8, 10, 20, 21, 22, 23], "dir": [2, 7, 8, 21, 23], "loki": [2, 6, 9], "mnt": 2, "3100": [2, 5], "rule": [2, 5, 7, 10, 29], "conf": [2, 5, 6], "promotheu": 2, "aprom": [2, 18], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 18], "d": [2, 5, 6, 7, 8, 20, 21, 22, 23], "scylla_manager_serv": [2, 5, 6, 18, 20, 22, 23], "node_exporter_serv": [2, 5, 6, 20, 21], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 18, 20, 37], "down": [2, 10, 18, 20, 21, 23, 25, 32], "begin": [3, 11, 12, 14, 17, 38], "deploi": [3, 6], "without": [3, 6, 7, 13, 20], "us": [3, 4, 5, 7, 9, 10, 11, 18, 20, 21, 22, 23, 27, 31, 32, 34, 36, 37], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6], "least": [4, 5, 6], "physic": [4, 5, 6], "core": [4, 5, 6], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 21, 23, 32, 36], "storag": [4, 5, 6, 7, 9, 13], "retent": [4, 5, 6, 20], "period": [4, 5, 6, 8, 10, 20, 36], "section": [4, 5, 6, 18, 20, 23, 37], "network": [4, 5, 6, 7, 18], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 18], "perform": [4, 5, 6, 31, 35, 37], "block": [4, 5, 6], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 27, 32, 34, 37], "default": [4, 5, 6, 7, 10, 13, 16, 18, 20, 22, 28, 37], "15": [4, 5, 6, 20], "dai": [4, 5, 6, 7, 20], "around": [4, 5, 6, 18], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 37], "assum": [4, 5, 6, 7, 8, 10, 21, 23], "scrape": [4, 5, 6], "interv": [4, 5, 6], "20": [4, 5, 6, 35], "6": [4, 5, 6, 13, 15], "node": [4, 5, 7, 15, 18, 20, 25, 26, 27, 31, 32, 34, 35, 37], "cluster": [4, 5, 6, 30, 37], "each": [4, 5, 7, 8, 9, 10, 13, 15, 18, 25, 27, 31, 36, 37], "16": [4, 5, 6, 18], "so": [4, 5, 6, 7, 8, 10, 13, 18, 20, 27, 37], "total": [4, 5, 6, 8, 13], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 20, 22, 29, 36, 37], "need": [4, 5, 6, 7, 8, 13, 18, 25, 26, 27, 37], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 13, 18, 33, 37], "replac": [4, 5, 6, 8, 13, 21, 23], "ad": [4, 5, 6, 7, 12], "we": [4, 5, 6, 8, 9, 13, 21, 23, 37], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 13, 18, 20, 25, 37], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 13, 18, 36, 37], "fast": [4, 5, 6], "enough": [4, 5, 6], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 13, 18, 20, 25, 31, 37], "out": [4, 5, 6, 8], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 31, 32, 34], "over": [4, 5, 6], "longer": [4, 5, 6, 13, 20, 22], "durat": [4, 5, 6, 10], "e": [4, 5, 6, 13], "g": [4, 5, 6, 7, 20, 21, 23], "look": [4, 5, 6, 8, 10, 13, 37], "week": [4, 5, 6, 7], "view": [4, 5], "would": [4, 5, 6, 8, 10, 13, 20, 24, 27, 37], "take": [4, 5, 6, 7, 13, 18, 20], "than": [4, 5, 6, 10, 13, 20, 37], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 13, 31], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 18, 22, 32], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 13, 16, 20, 37], "swap": [4, 5, 6], "crash": [4, 5, 6], "instruct": [5, 6, 21, 23], "help": [5, 7, 10, 13, 37], "pleas": [5, 18], "most": [5, 10, 13, 31, 33, 37], "current": [5, 6, 7, 10, 13, 18, 21, 23], "common": [5, 7, 37], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 18], "standalon": 5, "thei": [5, 7, 10, 35, 36], "alreadi": [5, 21, 23], "consolid": 5, "componen": 5, "suggest": [5, 13], "those": 5, "offici": 5, "also": [5, 6, 7, 8, 10, 13], "main": [5, 20, 36], "item": 5, "set": [5, 6, 7, 10, 13, 16], "avail": [5, 6, 8, 10, 12, 13, 14, 25, 26, 37], "data": [5, 7, 9, 10, 13, 20, 21, 22, 23, 24, 25, 26, 27, 31, 32, 34, 35, 37], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 18], "befor": [5, 6, 10, 20, 21, 22, 23, 25, 26, 32, 37], "support": [5, 6, 13, 14, 24, 30, 37], "want": [5, 6, 10, 21, 23], "latest": [5, 6, 7, 21, 23], "releas": [5, 20, 21, 22, 23], "tightli": 5, "compat": [5, 13, 18, 20, 22], "matrix": [5, 14], "cento": [5, 18], "instanc": [5, 6, 10, 13], "wget": [5, 6, 21, 23], "http": [5, 6, 8, 18, 20, 21, 23, 26, 27, 28, 30, 35], "com": [5, 6, 21, 23, 26, 27, 28, 30, 35], "archiv": [5, 6, 21, 23], "ref": 5, "tag": 5, "tar": [5, 6, 21, 23], "gz": [5, 6], "xvf": [5, 6], "test": [5, 18, 21, 37], "22": [5, 13], "linux": 5, "amd64": 5, "copi": [5, 20, 21, 22, 23], "file": [5, 7, 8, 10, 13, 16, 20, 22], "cp": [5, 21, 22, 23], "p": [5, 7, 8, 18, 20, 21, 23], "home": 5, "cd": [5, 6, 21, 23], "verifi": [5, 22], "point": [5, 6, 13, 21, 23], "browser": [5, 6, 8, 13, 18, 21, 23], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 18], "aggreg": 5, "inspir": 5, "central": [5, 9], "check": [5, 10, 18, 21, 23, 33, 34, 37], "recomand": 5, "local": [5, 6, 7, 8, 9, 13, 18, 21, 23, 37], "describ": [5, 6, 8, 16, 18, 37], "respons": [5, 10], "pars": [5, 9, 13, 29, 37], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 32, 34], "load": [5, 6, 18, 24, 27, 28, 37], "multipl": [5, 6, 7, 8, 9, 10, 13, 25, 28, 29, 35, 37], "do": [5, 6, 7, 13, 18, 20, 21, 22, 23, 27, 37], "rsyslog": [5, 9], "second": [5, 6, 10, 18, 20, 21, 23], "relat": [5, 37], "modifi": [5, 12], "mkdir": 5, "templat": [5, 6, 8, 18, 20, 37], "edit": [5, 6, 7, 8, 13, 18], "localhost": [5, 7], "loki_ip": 5, "": [5, 6, 7, 9, 10, 13, 24, 25, 33, 36, 37], "27": [5, 6, 13], "If": [5, 6, 7, 8, 13, 18, 20, 22, 33, 35, 36, 37], "besid": [5, 7, 20, 37], "expect": [5, 10, 21, 23], "scrap": 5, "job": [5, 6, 18], "onli": [5, 6, 7, 20, 22, 27, 29, 36, 37], "import": [5, 6, 7, 20, 21, 23], "record": 5, "asspect": 5, "work": [5, 6, 7, 8, 10, 13, 20, 21, 23], "code": [5, 31], "shell": 5, "prom_rul": 5, "correct": [5, 22], "static": 5, "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 20, 30], "host": [5, 6, 7, 9, 18], "static_config": [5, 6], "target": [5, 7, 13, 16, 18, 20, 22], "127": [5, 7, 18], "right": [5, 6, 13, 31, 37], "typic": [5, 13, 25, 27, 36, 37], "node_export": [5, 6, 7, 9, 15, 18], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 13, 16, 20, 22, 28, 37], "everi": [5, 6, 7], "scrape_timeout": 5, "4": [5, 6, 13, 15], "timeout": 5, "try": [5, 18], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10], "ani": [5, 6, 10, 13, 18, 31, 37], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 20], "scrape_config": [5, 20], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 16, 18], "There": [5, 6, 8, 10, 12, 13, 14, 35, 38], "instead": [5, 6, 8, 37], "found": [5, 6, 7, 10, 13], "must": [5, 6, 32], "even": [5, 6, 7], "center": [5, 6, 8, 37], "cat": 5, "list": [5, 6], "end": [5, 6, 20, 37], "66": [5, 18], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8], "dc1": [5, 6], "172": [5, 6, 18], "17": [5, 6, 15, 18, 22], "dc2": [5, 6], "previou": [5, 23], "deprec": 5, "5090": [5, 6, 18], "tsdb": [5, 7, 8], "accumul": 5, "consol": [5, 18], "visibl": 5, "execut": [5, 24, 29], "through": 5, "node_memory_memfre": 5, "And": [5, 21, 23], "scylla_reactor_util": 5, "At": [5, 13, 23], "emit": 5, "abl": [5, 8, 20, 22], "them": [5, 7, 9, 10, 13, 22, 31], "grafna": 5, "depend": [5, 8], "repositori": [5, 6], "yum": 5, "zip": [5, 21, 23], "structur": 5, "rest": [5, 8], "access": [5, 7], "sudo": [5, 6, 18], "r": [5, 7, 13, 18], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 13, 18], "provis": [5, 6, 13], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 13, 25, 26, 32, 36, 37], "folder": 5, "name": [5, 6, 8, 10, 18, 22, 37], "otherwis": 5, "apivers": 5, "type": [5, 13, 37], "url": [5, 8, 20], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "setup": 6, "dedic": 6, "pull": [6, 18], "evalu": 6, "laptop": 6, "tabl": [6, 10, 15, 24, 31, 37], "29": 6, "8": [6, 15, 20], "25": [6, 18], "avoid": [6, 13, 18, 28, 30, 37], "root": [6, 18, 21, 23], "go": [6, 18], "group": [6, 10], "groupadd": 6, "new": [6, 18, 36], "activ": [6, 10], "next": [6, 7, 8, 21, 23], "login": [6, 18], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 18, 20], "extract": 6, "binari": [6, 18], "As": [6, 13, 29], "clone": 6, "git": 6, "directli": [6, 9], "checkout": 6, "branch": 6, "restart": [6, 7, 8, 20], "know": [6, 18, 27, 37], "done": [6, 7, 13, 18], "higher": [6, 27, 37], "wish": [6, 7], "match": [6, 37], "datacent": 6, "nodetool": 6, "statu": [6, 18], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 20], "listen": [6, 7, 16, 20], "inform": [6, 7, 12, 13, 14, 16, 24, 25, 26], "agent": [6, 7, 8, 9, 15, 18], "machin": [6, 7, 18, 22], "overrid": [6, 7, 13], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 13], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 18, 21, 23], "10": [6, 10, 13], "within": [6, 10], "cql": [6, 9, 31, 38], "protect": 6, "author": [6, 7], "assign": 6, "limit": [6, 8, 10, 28, 37], "keyspac": 6, "securejsondata": 6, "part": [6, 10, 22, 24, 27, 31, 37], "place": [6, 7, 8, 13, 37], "outsid": [6, 7, 20], "result": [6, 7, 20, 25, 27, 28, 36, 37], "lost": [6, 7, 13, 37], "exist": [6, 13, 37], "permiss": [6, 20], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 37], "firewal": [6, 18], "7000": [6, 18], "myservic": 6, "m": [6, 7, 20, 21, 23], "2019": [6, 15, 35], "reach": [6, 8, 27, 32, 37], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 27, 28, 32, 34, 37], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 13, 18], "authent": [6, 7], "disabl": [6, 16], "option": [6, 8, 9, 18, 20], "simplest": 7, "small": [7, 36], "util": [7, 13, 22], "appropri": 7, "h": [7, 13], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 32], "map": 7, "bind": [7, 16], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 20, 26, 29, 31], "addit": [7, 9, 10, 12, 14, 37], "auto": 7, "automat": 7, "failur": [7, 18], "gui": [7, 13, 18], "keep": [7, 20], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "specif": [7, 10, 16, 18, 33, 37], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "role": 7, "privileg": 7, "That": [7, 10, 13], "mean": [7, 13, 20, 24, 25, 26, 27, 28, 32, 34, 37], "chang": [7, 13, 16, 18, 20, 21, 22, 23], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 13], "b": 7, "o": [7, 15, 22, 31], "disk": [7, 10, 13, 18, 24, 26, 31], "relev": [7, 31], "possibl": [7, 10, 16, 30, 37], "api": [7, 8, 16, 20], "resolv": 7, "explicitli": [7, 13], "request": [7, 16, 31], "how": [7, 8, 10, 13, 21, 23, 25, 26, 27, 31, 37], "someth": [7, 10, 11, 13, 36], "opportun": 7, "demonstr": 7, "cover": [7, 20], "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "additiuon": 8, "high": [8, 13, 26], "horizont": 8, "scale": 8, "backup": 8, "benefit": [8, 37], "flexibl": 8, "design": 8, "some": [8, 10, 31, 35], "front": 8, "few": [8, 9, 21, 23], "reason": [8, 13, 18, 34, 37], "why": [8, 13], "million": 8, "singl": [8, 13, 31], "capac": 8, "sometim": 8, "traffic": [8, 18, 35, 37], "between": [8, 18, 20, 21, 23, 31, 37], "reachabl": [8, 20], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 13, 20, 21, 23, 26], "expos": [8, 16, 20], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 31], "10903": 8, "10904": 8, "replica": [8, 25, 26, 27, 31, 32, 37], "connect": [8, 13, 16, 18], "abov": [8, 21, 23], "last": 8, "db_address": 8, "could": [8, 31, 35, 37], "long": [8, 10, 36], "now": [8, 10], "grafan": 9, "render": [9, 13], "sidecar": 9, "receiv": [9, 10, 37], "distribut": [9, 27, 35, 37], "email": [9, 10], "slack": [9, 10], "displai": [9, 22], "enhanc": [10, 11], "notifi": [10, 11, 31], "wrong": [10, 11, 13, 18, 36, 37], "shown": [10, 18, 21, 23], "overview": [10, 26, 31], "condit": 10, "met": 10, "certain": 10, "defin": [10, 13, 20, 30, 37], "what": 10, "happen": [10, 18], "report": [10, 15, 18, 37], "let": [10, 20], "u": 10, "instancedown": 10, "expr": [10, 13], "60": 10, "sever": [10, 12, 14, 38], "annot": 10, "descript": [10, 31], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 13, 21], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 37], "rout": [10, 27, 37], "repres": 10, "tree": 10, "win": [10, 18], "inhibit": 10, "mute": 10, "via": [10, 18], "sluck": 10, "detail": [10, 31], "wors": 10, "correctli": [10, 13, 20, 22], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 22], "reduc": [10, 13, 25], "simul": 10, "actual": [10, 34], "low": [10, 37], "space": 10, "lower": [10, 37], "fire": 10, "show": [10, 13, 15, 37], "propag": 10, "valu": [10, 13, 29, 36, 37], "similar": [10, 13], "free": 10, "big": [10, 37], "bisect": 10, "problem": [10, 31, 37], "give": [12, 14], "explain": [13, 21, 23, 31], "intern": [13, 27, 37], "issu": [13, 31, 35, 37], "whenev": 13, "gone": 13, "save": 13, "mention": 13, "earlier": 13, "overridden": 13, "perman": 13, "eventu": 13, "made": 13, "larg": [13, 31], "maintain": 13, "json": 13, "too": [13, 36], "verbos": 13, "element": [13, 31], "object": 13, "attribut": 13, "graph": [13, 20, 22, 37], "aliascolor": 13, "bar": 13, "error": [13, 31, 32, 34], "fill": 13, "grid": 13, "threshold1": 13, "null": 13, "threshold1color": 13, "rgba": 13, "216": 13, "200": 13, "threshold2": 13, "threshold2color": 13, "234": 13, "112": 13, "gridpo": 13, "w": [13, 18], "x": [13, 18, 19], "y": [13, 19], "id": [13, 18], "isnew": 13, "legend": 13, "avg": 13, "max": 13, "min": 13, "linewidth": 13, "link": [13, 31], "nullpointmod": 13, "percentag": [13, 37], "pointradiu": 13, "flot": 13, "seriesoverrid": 13, "span": 13, "steppedlin": 13, "sum": 13, "node_filesystem_avail": 13, "intervalfactor": 13, "legendformat": 13, "refid": 13, "timefrom": 13, "timeshift": 13, "titl": 13, "size": [13, 28, 37], "tooltip": 13, "msresolut": 13, "share": 13, "sort": [13, 30, 37], "value_typ": 13, "cumul": 13, "transpar": 13, "xaxi": 13, "yax": 13, "percent": 13, "logbas": 13, "101": 13, "short": 13, "imagin": 13, "redund": 13, "resembl": 13, "css": 13, "hierarch": 13, "definit": [13, 20, 37], "inherit": 13, "row": [13, 30, 37], "base_row": 13, "collaps": 13, "height": 13, "250px": 13, "150px": 13, "output": 13, "bytes_panel": 13, "byte": 13, "unit": 13, "axi": 13, "adjust": 13, "readabl": 13, "gb": 13, "mb": 13, "grasp": 13, "origin": [13, 33], "12": [13, 18], "wa": [13, 37], "larger": 13, "break": [13, 28, 37], "later": 13, "absolut": 13, "posit": 13, "ie": 13, "width": 13, "backward": [13, 18, 20, 22], "ve": 13, "had": 13, "imposs": 13, "hand": 13, "overcom": 13, "transit": [13, 22], "calcul": 13, "taken": [13, 20], "still": 13, "unlik": 13, "partial": 13, "24": 13, "don": 13, "python": 13, "make_dashboard": 13, "revers": [13, 31], "usual": [13, 18, 31, 37], "easier": 13, "wrapper": 13, "re": [13, 27], "just": 13, "refresh": 13, "generate_gener": 13, "mayb": 13, "interfac": [14, 18], "2021": 15, "2018": [15, 28], "14": [15, 18], "onlin": 16, "prometheus_port": 16, "restrict": 16, "prometheus_address": 16, "integr": 17, "56090": 18, "old": [18, 21, 22, 23], "howev": 18, "twice": 18, "easiest": 18, "remov": [18, 20], "scylla_manager1": 18, "messag": 18, "wait": [18, 32], "non": [18, 20, 26, 27, 31, 35, 37], "post": 18, "proper": 18, "past": [18, 22], "mai": [18, 31, 32, 37], "ownership": 18, "la": 18, "grep": 18, "drwxr": 18, "xr": 18, "4096": 18, "jun": 18, "51": 18, "chown": 18, "appear": 18, "unreach": [18, 32], "immedi": 18, "suspect": 18, "tab": 18, "rang": [18, 37], "align": 18, "On": [18, 31], "41bd3db26240": 18, "entrypoin": 18, "ago": 18, "23": 18, "7001": 18, "tcp": 18, "9042": 18, "9160": 18, "10000": 18, "click": 18, "usag": [18, 27, 37], "fetch": 18, "curl": 18, "scylla_nod": 18, "return": [18, 20, 24, 25, 26, 28, 32, 34, 37], "ef": 18, "gre": 18, "scylla_setup": 18, "9100": 18, "while": [18, 20, 21, 23], "captur": 18, "tshark": 18, "f": 18, "dst": 18, "eth0": 18, "toward": 18, "199": 18, "203": 18, "229": 18, "89": 18, "142": 18, "59212": 18, "ack": 18, "seq": 18, "317": 18, "78193": 18, "158080": 18, "len": 18, "tsval": 18, "79869679": 18, "tsecr": 18, "3347447210": 18, "74": 18, "60440": 18, "syn": 18, "29200": 18, "mss": 18, "1460": 18, "sack_perm": 18, "79988291": 18, "128": 18, "sinc": 20, "parallel": [20, 21, 23], "migrat": [20, 21, 23], "lose": 20, "histor": 20, "process": 20, "safe": 20, "page": [20, 22, 31], "unzip": [20, 21, 22, 23], "3001": [20, 21, 23], "9091": [20, 21, 23], "9094": 20, "fail": [20, 25, 27, 31, 37], "loss": 20, "everyth": 20, "stop": [20, 21, 22, 23], "format": 20, "were": [20, 37], "rule_fil": 20, "montior": 20, "9111": 20, "phase": [20, 22], "serv": 20, "remote_read": 20, "v1": 20, "histori": [20, 22], "continu": [20, 21, 23], "back": [20, 25], "recommend": [21, 23], "uninstal": [21, 23], "minor": [21, 23], "first": [21, 23, 37], "9095": [21, 23], "brows": [21, 23], "satisfi": [21, 23], "shut": [21, 23], "caus": [21, 23, 27, 37], "blackout": [21, 23], "normal": [21, 23], "dure": [21, 23], "oper": [21, 23, 31, 37], "complet": [21, 23], "switch": 22, "fulli": 22, "affect": 22, "helper": 22, "node_exporter_instal": 22, "ship": 22, "sub": 22, "color": 22, "simpli": 22, "side": [23, 24, 31, 37], "newer": 23, "previous": 23, "primari": [24, 37], "kei": [24, 30, 37], "scan": 24, "These": [24, 37], "kind": [24, 37], "bigger": 24, "care": [24, 25, 26, 37], "replicationfactor": [25, 26], "piec": 25, "determin": [25, 26, 32, 37], "mani": [25, 26, 37], "repli": [25, 26, 28, 32, 34, 37], "unavail": [25, 37], "client": [25, 28, 31, 37], "respond": 25, "accompani": 25, "deep": 25, "understand": 25, "fall": 25, "mechan": 25, "write": 26, "acknowledg": 26, "coordin": [26, 27, 32, 34, 37], "hint": 26, "fact": 26, "yet": 26, "cours": [26, 27], "essenti": 26, "text": [26, 37], "20of": 26, "20the": 26, "20most": 26, "20common": 26, "20with": 26, "20lowest": 26, "20consist": 26, "ideal": [27, 37], "latenc": [27, 31, 37], "resourc": [27, 30, 37], "driver": [27, 28, 35, 37], "replic": [27, 32, 34, 37], "prepar": [27, 31, 35], "statement": [27, 29, 31, 35], "balanc": [27, 31, 37], "polici": 27, "intro": 27, "recap": 27, "ring": [27, 37], "architectur": 27, "chunk": [28, 37], "increas": [28, 37], "overal": [28, 37], "thu": 28, "www": [28, 35], "07": 28, "13": 28, "effici": [28, 37], "optim": [29, 35, 38], "concret": 29, "thumb": 29, "alwai": 29, "favor": 29, "partit": [30, 31], "BY": [30, 37], "ineffici": [30, 37], "consum": 30, "doc": 30, "recogn": 31, "bad": 31, "practic": [31, 35], "potenti": [31, 37], "solv": 31, "left": 31, "categori": [31, 37], "jump": 31, "warn": 31, "cell": 31, "indic": [31, 36, 37], "model": [31, 35, 37], "impact": 31, "imbal": 31, "shard": 31, "imbalanc": 31, "hot": 31, "bottleneck": [31, 35], "cach": 31, "hit": 31, "filter": 31, "token": 31, "awar": 31, "select": [31, 37], "order": [31, 37], "due": 31, "unsatisfi": 31, "faulti": 31, "evict": 31, "answer": [32, 34], "aka": 32, "factor": 32, "quorum": [32, 37], "hardwar": 33, "occur": 33, "leav": 34, "risk": 34, "identifi": [34, 37], "evenli": 35, "across": 35, "becom": 35, "explan": 35, "08": 35, "best": 35, "field": 36, "being": 36, "defi": 36, "purpos": 36, "might": 36, "upper": 37, "gaug": 37, "inspect": 37, "zero": 37, "mislead": 37, "panel": 37, "holder": 37, "safer": 37, "prevent": 37, "inject": 37, "rate": 37, "did": 37, "compound": 37, "column": 37, "ks1": 37, "table_demo": 37, "int": 37, "WITH": 37, "desc": 37, "cat1": 37, "asc": 37, "overhead": 37, "thing": 37, "much": 37, "drop": 37, "major": 37, "success": 37, "hurt": 37, "cl": 37, "expens": 37, "term": 37, "cost": 37, "ONE": 37, "local_quorum": 37, "local_on": 37, "reli": 37, "nearest": 37, "advisor": 38}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 31, 38], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 31, 38], "stack": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 31, 38], "us": [2, 6, 8, 13, 24, 25, 26, 30, 38], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 13], "set": [2, 20, 21, 23], "prometheu": [2, 4, 5, 6, 7, 8, 10, 16, 20], "grafana": [2, 5, 6, 7, 13, 18], "provis": 2, "data": [2, 6, 8, 18], "sourc": [2, 8, 18], "file": [2, 6, 18, 21, 23], "dashboard": [2, 6, 13], "load": 2, "start": [2, 6, 7, 18], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 20, 21, 22, 23], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 13, 20], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 33], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "compat": 6, "matrix": [6, 15], "post": [6, 28, 35], "configur": [6, 8], "node": [6, 33], "from": [6, 13], "manag": [6, 7, 11, 18], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 18], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": [6, 20, 21, 22, 23], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 13, 21, 23, 31, 37], "all": [7, 21, 23, 25], "sh": [7, 13], "command": 7, "gener": [7, 13], "option": 7, "relat": [7, 20, 21, 22, 23], "ldap": 7, "support": [7, 15], "retent": 7, "period": 7, "alert": [7, 10, 11, 20], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 24, 25, 26, 27, 28, 29, 30, 35, 37], "updat": 8, "high": 9, "level": [9, 18, 25, 26, 32, 37], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 13], "procedur": [12, 20, 21, 22, 23], "modifi": 13, "limit": 13, "consist": [13, 25, 26, 32, 37], "between": 13, "restart": 13, "upgrad": [13, 18, 19, 20, 21, 22, 23], "templat": 13, "class": 13, "panel": 13, "exampl": 13, "format": 13, "layout": 13, "valid": [13, 20, 21, 22, 23], "refer": 14, "guid": [14, 17, 20, 21, 22, 23], "interfac": 16, "troubleshoot": [17, 18], "problem": 18, "2": [18, 20, 21, 22], "duplic": 18, "inform": 18, "A": 18, "contain": [18, 21, 23], "fail": [18, 32, 34], "To": 18, "And": 18, "permiss": 18, "No": 18, "point": 18, "solut": 18, "chart": 18, "show": 18, "error": [18, 33], "sign": 18, "server": [18, 21, 23], "metric": 18, "notic": 18, "user": 18, "open": 18, "3": [18, 20, 22, 23], "0": 18, "enterpris": 18, "2019": 18, "1": [18, 20, 22], "work": 18, "wireshark": 18, "x": [20, 21, 22, 23], "latest": 20, "new": [20, 21, 22, 23], "rule": 20, "4": 20, "move": [20, 21, 23], "old": 20, "b": 20, "rollback": [20, 21, 22, 23], "link": [20, 21, 22, 23, 26, 27, 28, 30, 35], "y": [21, 23], "": [21, 23], "i": [21, 23, 33], "run": [21, 23], "correct": [21, 23], "correctli": [21, 23], "kill": [21, 23], "node_export": 22, "test": 23, "mode": 23, "some": [24, 25, 26, 27, 28, 29, 30, 32, 34], "allow": [24, 37], "filter": [24, 37], "ani": 26, "univers": [26, 27], "ar": [27, 28, 29, 35], "token": [27, 37], "awar": [27, 37], "select": 28, "non": [28, 29], "page": [28, 37], "blog": [28, 35], "prepar": [29, 36, 37], "revers": [30, 37], "order": 30, "document": 30, "advisor": 31, "section": 31, "oper": [32, 34], "due": 32, "unsatisfi": 32, "o": 33, "can": 33, "indic": 33, "faulti": 33, "replica": 34, "side": 34, "cql": [35, 37], "balanc": 35, "among": 35, "shard": 35, "statement": [36, 37], "cach": 36, "evict": 36, "optim": 37, "read": 37, "cross": 37, "dc": 37, "request": 37}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"CQL queries are not balanced among shards": [[35, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[35, "blog-post-link"]], "Some SELECT queries are non-paged": [[28, "some-select-queries-are-non-paged"]], "Blog-post Links": [[28, "blog-post-links"]], "Some queries use reverse order": [[30, "some-queries-use-reverse-order"]], "Documentation link": [[30, "documentation-link"]], "Scylla Monitoring Stack Advisor": [[31, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[31, "the-advisor-section"]], "Some queries are not token-aware": [[27, "some-queries-are-not-token-aware"]], "University link": [[27, "university-link"]], "Some queries are non-prepared": [[29, "some-queries-are-non-prepared"]], "Some operation failed due to unsatisfied consistency level": [[32, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Some operations failed on the replica side": [[34, "some-operations-failed-on-the-replica-side"]], "I/O Errors can indicate a node with a faulty disk": [[33, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Scylla Monitoring Stack Procedures": [[12, "scylla-monitoring-stack-procedures"]], "Scylla Monitoring Stack Reference Guide": [[14, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Interfaces": [[16, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[16, "prometheus"]], "Adding and Modifying Dashboards": [[13, "adding-and-modifying-dashboards"]], "General Limitations": [[13, "general-limitations"]], "consistency between restarts": [[13, "consistency-between-restarts"]], "consistency between upgrades": [[13, "consistency-between-upgrades"]], "Using templated Dashboards": [[13, "using-templated-dashboards"]], "The template class system": [[13, "the-template-class-system"]], "Panel example": [[13, "panel-example"]], "Grafana Formats and Layouts": [[13, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[13, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[13, "prerequisite"], [2, "prerequisite"]], "Validation": [[13, "validation"], [20, "validation"]], "Scylla Monitoring Stack": [[9, "scylla-monitoring-stack"], [1, "scylla-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Stack Support Matrix": [[15, "scylla-monitoring-stack-support-matrix"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[17, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Some queries use ALLOW FILTERING": [[24, "some-queries-use-allow-filtering"]], "Some queries use Consistency Level: ANY": [[26, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[26, "link-to-scylla-university"]], "Troubleshoot Scylla Monitoring Stack": [[18, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[18, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[18, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[18, "a-container-fails-to-start"]], "Files And Directory Permissions": [[18, "files-and-directory-permissions"]], "No Data Points": [[18, "no-data-points"]], "Solution": [[18, "solution"], [18, "id1"], [18, "id2"], [18, "id3"]], "Grafana Chart Shows Error (!) Sign": [[18, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[18, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[18, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[18, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[18, "working-with-wireshark"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[23, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Upgrade Procedure": [[23, "upgrade-procedure"], [20, "upgrade-procedure"], [22, "upgrade-procedure"], [21, "upgrade-procedure"]], "Install 3.y (The new version)": [[23, "install-3-y-the-new-version"]], "Setting the server\u2019s files": [[23, "setting-the-server-s-files"], [21, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[23, "validate-the-new-version-is-running-the-correct-version"], [21, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[23, "validate-the-version-installed-correctly"], [21, "validate-the-version-installed-correctly"]], "Killing the new 3.y Monitoring stack in testing mode": [[23, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[23, "move-to-version-3-y-the-new-version"]], "Kill all containers": [[23, "kill-all-containers"], [21, "kill-all-containers"]], "Rollback to version 3.x": [[23, "rollback-to-version-3-x"]], "Related Links": [[23, "related-links"], [20, "related-links"], [22, "related-links"], [21, "related-links"]], "Some queries use Consistency Level: ALL": [[25, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[20, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[20, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[20, "install-the-new-monitoring-stack"], [22, "install-the-new-monitoring-stack"]], "3. Alerting Rules": [[20, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[20, "moving-to-prometheus-2-x"]], "a. Set the old system": [[20, "a-set-the-old-system"]], "b. Set the new system": [[20, "b-set-the-new-system"]], "Validate the upgrade": [[20, "validate-the-upgrade"], [22, "validate-the-upgrade"]], "Rollback": [[20, "rollback"], [22, "rollback"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[22, "validate-node-exporter-version"]], "Upgrade Scylla Monitoring Stack": [[19, "upgrade-scylla-monitoring-stack"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[21, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[21, "install-2-y-the-new-version"]], "Move to version 2.y (the new version)": [[21, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[21, "rollback-to-version-2-x"]], "Prepared statements cache eviction": [[36, "prepared-statements-cache-eviction"]], "The CQL Optimization": [[37, "the-cql-optimization"]], "Prepared Statements": [[37, "prepared-statements"]], "Token Aware": [[37, "token-aware"]], "Paged Queries": [[37, "paged-queries"]], "Reversed CQL Reads": [[37, "reversed-cql-reads"]], "ALLOW FILTERING": [[37, "allow-filtering"]], "Consistency Level": [[37, "consistency-level"]], "Cross DC": [[37, "cross-dc"]], "Cross DC Consistency Level": [[37, "cross-dc-consistency-level"]], "Cross DC read requests": [[37, "cross-dc-read-requests"]], "Using Scylla Monitoring Stack": [[38, "using-scylla-monitoring-stack"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Minimal Production System Recommendations": [[6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[6, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "The start-all.sh command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.9/sitemap.xml b/branch-3.9/sitemap.xml new file mode 100644 index 000000000..f779c2582 --- /dev/null +++ b/branch-3.9/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.9/troubleshooting/index.html b/branch-3.9/troubleshooting/index.html new file mode 100644 index 000000000..2c964ee5e --- /dev/null +++ b/branch-3.9/troubleshooting/index.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Troubleshooting Guide for Scylla Monitoring Stack

                  +
                  +
                  +

                  Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/troubleshooting/monitor_troubleshoot.html b/branch-3.9/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..845ead84b --- /dev/null +++ b/branch-3.9/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,877 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Troubleshoot Scylla Monitoring Stack

                  +

                  This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                  +
                  +

                  Problem

                  + +
                  +

                  Scylla-Manager 2.2 with Duplicate information

                  +

                  Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                  +
                    +
                  • For Manager server: from 56090 to 5090

                  • +
                  • For Manager Agent: from 56090 to 5090

                  • +
                  +

                  For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                  +

                  However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                  +

                  The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                  +

                  Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                  +
                  +
                  +

                  A Container Fails To Start

                  +

                  When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                  +
                  Wait for Prometheus container to start........Error: Prometheus container failed to start
                  +
                  +
                  +

                  Should this happen, check the Docker logs for more information.

                  +
                  docker logs aprom
                  +
                  +
                  +

                  Usually the reason for the failure is described in the logs.

                  +
                  +
                  +

                  Files And Directory Permissions

                  +
                  +

                  Note

                  +

                  Avoid running Docker containers as root.

                  +
                  +

                  The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                  +

                  If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                  +
                  +

                  Note

                  +

                  If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                  +
                  +

                  For example if your Prometheus data directory is /prom-data and you are using centos user

                  +
                  ls -la /|grep prom-data
                  +
                  +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                  +
                  +sudo chown -R centos:centos /prom-data
                  +
                  +ls -la /|grep prom-data
                  +
                  +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                  +
                  +
                  +
                  +
                  +

                  No Data Points

                  +

                  No data points on all data charts.

                  +
                  +

                  Solution

                  +

                  If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                  +
                    +
                  1. Login to the Prometheus console:

                  2. +
                  3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                  4. +
                  5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                  6. +
                  +
                  +
                    +
                  • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                  • +
                  • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                  • +
                  • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                  • +
                  +
                  +

                  For example:

                  +
                  ./start-all.sh -v 3.1
                  +
                  +
                  +

                  More on start-all.sh options.

                  +
                  +
                  +
                  +

                  Grafana Chart Shows Error (!) Sign

                  +

                  Run this procedure on the Scylla Monitoring Stack server.

                  +

                  If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                  +
                  +

                  Solution

                  +

                  On the Scylla Monitoring Stack server:

                  +
                    +
                  1. Check Prometheus is running using docker ps.

                  2. +
                  +
                    +
                  • If it is not running check the prometheus.yml for errors.

                  • +
                  +

                  For example:

                  +
                  CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                  +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                  +
                  +
                  +
                    +
                  • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                  • +
                  +
                  +
                  +
                  +

                  Grafana Shows Server Level Metrics, but not Scylla Metrics

                  +

                  Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                  +
                  +

                  Solution

                  +
                    +
                  • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                  • +
                  +

                  For example

                  +
                  curl 172.17.0.2:9180/metrics
                  +
                  +
                  +
                  +
                  +
                  +

                  Grafana Shows Scylla Metrics, but not Server Level Metrics

                  +

                  Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                  +
                  +

                  Solution

                  +

                  1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                  +
                    +
                  1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                  2. +
                  +
                  +
                  +

                  Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                  +

                  While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                  +

                  If the node_exporter service is not starting it may need to be updated manually.

                  +

                  Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                  +
                  +
                  +
                  +

                  Working with Wireshark

                  +

                  No metrics shown in the Scylla Monitoring Stack.

                  +
                    +
                  1. Install wireshark

                  2. +
                  +

                  2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                  +

                  For example:

                  +
                  tshark -i eth0 -f "dst port 9180"
                  +
                  +
                  +

                  Capture from Scylla node towards Scylla Monitoring Stack server.

                  +

                  In this example, Scylla is running.

                  +
                  Monitor ip        Scylla node ip
                  +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                  +
                  +
                  +

                  In this example, Scylla is not running

                  +
                  Monitor ip        Scylla node ip
                  +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                  +
                  +
                  +
                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/upgrade/index.html b/branch-3.9/upgrade/index.html new file mode 100644 index 000000000..ddd66ffcc --- /dev/null +++ b/branch-3.9/upgrade/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Upgrade Scylla Monitoring Stack

                  +
                  +
                  +
                  +
                  +
                  +
                  Upgrade Scylla Open Source
                  +
                  + +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-3.9/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..d24afad95 --- /dev/null +++ b/branch-3.9/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,816 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                  +

                  This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

                  + +

                  Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                  +
                  +

                  Upgrade Procedure

                  +
                  +

                  1. Upgrade to the latest 1.x version

                  +

                  Before starting the upgrade procedure, make sure you are running the latest 1.x version

                  +
                  +
                  +

                  2. Install the new monitoring stack

                  +
                    +
                  1. Download the 2.x version from the release page.

                  2. +
                  3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                  4. +
                  5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                    +
                      +
                    • scylla_servers.yml

                    • +
                    • scylla_manager_servers.yml

                    • +
                    • node_exporter_servers.yml

                    • +
                    +
                  6. +
                  7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                  8. +
                  +
                  ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                  +
                  +
                  +
                  +

                  Note

                  +

                  Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                  +
                  +

                  While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                  +
                  ./kill-all.sh -g 3001 -p 9091 -m 9094
                  +
                  +
                  +
                  +

                  Validation

                  +

                  Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                  +
                  +
                  +
                  +

                  3. Alerting Rules

                  +

                  Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                  +
                  +
                  +

                  4. Moving to Prometheus 2.x

                  +

                  Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                  +

                  Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                  +
                  +

                  a. Set the old system

                  +

                  The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                  +
                    +
                  • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                  • +
                  • Restart the old montioring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                  • +
                  +
                  +

                  Note

                  +

                  After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                  +
                  +
                  +
                  +

                  b. Set the new system

                  +

                  The following step will allow the new monitoring system to read historical metrics from the old system.

                  +
                    +
                  • In the Prometheus prometheus.yml.template file add the following at the end:

                  • +
                  +
                  remote_read:
                  +  - url: "http://{ip}:9111/api/v1/read"
                  +
                  +
                  +

                  Where {ip} is the ip of the old system.

                  +
                    +
                  • restart the new stack

                  • +
                  +
                  +
                  +
                  +

                  Validate the upgrade

                  +

                  You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                  +
                  +
                  +
                  +

                  Rollback

                  +

                  In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                  +
                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..58d99e59e --- /dev/null +++ b/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,805 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                  +

                  This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                  + +
                  +

                  Upgrade Procedure

                  +

                  We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                  +

                  Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                  +
                  +

                  Install 2.y (The new version)

                  +
                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                  +unzip scylla-monitoring-2.y.zip
                  +cd scylla-monitoring-scylla-monitoring-2.y/
                  +
                  +
                  +

                  Replace “y” with the new minor release number, for example, 2.1.zip

                  +
                  +
                  +

                  Setting the server’s files

                  +

                  Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                  +
                  cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                  +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                  +
                  +
                  +
                  +
                  +

                  Validate the new version is running the correct version

                  +

                  Starting from Scylla-Monitoring version 2.2, you can run:

                  +
                  ./start-all.sh --version
                  +
                  +
                  +

                  To validate the Scylla-Monitoring version.

                  +
                  +
                  +

                  Validate the version installed correctly

                  +

                  To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                  +
                  ./start-all.sh -p 9091 -g 3001 -m 9095
                  +
                  +
                  +

                  Browse to http://{ip}:9091 +And check the Grafana dashboard

                  +

                  Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                  +
                  +

                  Caution

                  +

                  Important: do not use the local dir flag when testing!

                  +
                  +

                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                  +
                  +

                  Caution

                  +

                  Important: Do not kill the 2.x version that is currently running.

                  +
                  +

                  Use the following command to kill the containers:

                  +
                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                  +
                  +
                  +

                  You can start and stop the new 2.y version while testing.

                  +
                  +
                  +

                  Move to version 2.y (the new version)

                  +

                  Note: migrating will cause a few seconds of blackout in the system.

                  +

                  We assume that you are using external volume to store the metrics data.

                  +
                  +

                  Kill all containers

                  +

                  Follow the instruction on how to kill the 2.y version when in testing mode.

                  +

                  To kill the 2.x version containers, run:

                  +
                  ./kill-all.sh
                  +
                  +
                  +

                  Start version 2.y in normal mode

                  +

                  From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                  +
                  ./start-all.sh -d /path/to/data/dir
                  +
                  +
                  +

                  Point your browser to http://{ip}:3000 and see that the data is there.

                  +
                  +
                  +
                  +

                  Rollback to version 2.x

                  +

                  To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                  +

                  To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                  +
                  ./kill-all.sh
                  +cd /path/to/scylla-grafana-2.x/
                  +./start-all.sh -d /path/to/data/dir
                  +
                  +
                  +
                  +
                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..03c3c4d4e --- /dev/null +++ b/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,763 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                  +

                  This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

                  + +

                  Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                  +
                  +

                  Upgrade Procedure

                  +
                  +

                  1. Validate node_exporter version

                  +

                  Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                  +

                  If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                  +
                  +
                  +

                  2. Install the new monitoring stack

                  +
                    +
                  1. Download the 3.x version from the release page.

                  2. +
                  3. Unzip it into a different directory.

                  4. +
                  5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                    +
                      +
                    • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                    • +
                    • scylla_manager_servers.yml

                    • +
                    +
                    +
                    +

                    Note

                    +

                    The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                    +
                    +
                    +
                  6. +
                  7. Stop the old monitoring stack

                    +
                    +
                    ./kill-all.sh
                    +
                    +
                    +
                    +
                  8. +
                  9. Start the new monitoring stack

                    +
                    +
                    ./start-all.sh -d /prometheus-data-path
                    +
                    +
                    +
                    +
                  10. +
                  +
                  +
                  +

                  Validate the upgrade

                  +

                  You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                  +

                  Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                  +
                  +
                  +
                  +

                  Rollback

                  +

                  To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                  +
                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-3.9/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..a48299682 --- /dev/null +++ b/branch-3.9/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,814 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                  +

                  This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                  + +
                  +

                  Upgrade Procedure

                  +

                  We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                  +

                  Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                  +
                  +

                  Install 3.y (The new version)

                  +
                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                  +unzip scylla-monitoring-3.y.zip
                  +cd scylla-monitoring-scylla-monitoring-3.y/
                  +
                  +
                  +

                  Replace “y” with the new minor release number, for example, 3.0.1.zip

                  +
                  +
                  +

                  Setting the server’s files

                  +

                  Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                  +
                  cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                  +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                  +
                  +
                  +
                  +
                  +

                  Validate the new version is running the correct version

                  +

                  Starting from Scylla-Monitoring version 2.2, you can run:

                  +
                  ./start-all.sh --version
                  +
                  +
                  +

                  To validate the Scylla-Monitoring version.

                  +
                  +
                  +

                  Validate the version installed correctly

                  +

                  To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                  +
                  ./start-all.sh -p 9091 -g 3001 -m 9095
                  +
                  +
                  +

                  Browse to http://{ip}:9091 +And check the Grafana dashboard

                  +

                  Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                  +
                  +

                  Caution

                  +

                  Important: do not use the local dir flag when testing!

                  +
                  +

                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                  +
                  +

                  Caution

                  +

                  Important: Do not kill the 3.x version that is currently running.

                  +
                  +
                  +
                  +

                  Killing the new 3.y Monitoring stack in testing mode

                  +

                  Use the following command to kill the containers:

                  +
                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                  +
                  +
                  +

                  You can start and stop the new 3.y version while testing.

                  +
                  +
                  +

                  Move to version 3.y (the new version)

                  +

                  Note: migrating will cause a few seconds of blackout in the system.

                  +

                  We assume that you are using external volume to store the metrics data.

                  +
                  +

                  Kill all containers

                  +

                  At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                  +

                  Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                  +

                  kill the older 3.x version containers by running:

                  +
                  ./kill-all.sh
                  +
                  +
                  +

                  Start version 3.y in normal mode

                  +

                  From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                  +
                  ./start-all.sh -d /path/to/data/dir
                  +
                  +
                  +

                  Point your browser to http://{ip}:3000 and see that the data is there.

                  +
                  +
                  +
                  +

                  Rollback to version 3.x

                  +

                  To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                  +

                  To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                  +
                  ./kill-all.sh
                  +cd /path/to/scylla-grafana-3.x/
                  +./start-all.sh -d /path/to/data/dir
                  +
                  +
                  +
                  +
                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlAllowFiltering.html b/branch-3.9/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..8063ec3d7 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries use ALLOW FILTERING

                  +

                  Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                  +

                  These kinds of queries can create a bigger load on Scylla, and should be used with care.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlCLAll.html b/branch-3.9/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..c7b90922c --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries use Consistency Level: ALL

                  +

                  Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                  +

                  Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                  +

                  Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlCLAny.html b/branch-3.9/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..539c61853 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries use Consistency Level: ANY

                  +

                  Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                  +

                  Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlNoTokenAware.html b/branch-3.9/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..e39e88119 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries are not token-aware

                  +

                  Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                  +

                  Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlNonPaged.html b/branch-3.9/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..95d515633 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some SELECT queries are non-paged

                  +

                  By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                  +
                  +

                  Blog-post Links

                  +

                  https://www.scylladb.com/2018/07/13/efficient-query-paging/

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlNonPrepared.html b/branch-3.9/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..1b241420c --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries are non-prepared

                  +

                  Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlReverseOrder.html b/branch-3.9/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..ca3adc1a6 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries use reverse order

                  +

                  Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                  +

                  Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/index.html b/branch-3.9/use-monitoring/advisor/index.html new file mode 100644 index 000000000..4590ddb57 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/index.html @@ -0,0 +1,711 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Advisor

                  +
                  +
                  +

                  The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them.

                  +
                  +

                  The Advisor section

                  +
                  +../../_images/advisor_panel.png +
                  +

                  The Advisor section

                  +
                  +
                  +

                  The Advisor section is located on the Overview dashboard and consists of two parts:

                  +

                  On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                  +

                  For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                  +

                  On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                  +

                  For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                  +

                  Each Advisor issue is explained in detail:

                  + +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/nodeCLErrors.html b/branch-3.9/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..cd8ec3032 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Some operation failed due to unsatisfied consistency level

                  +

                  ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                  +

                  For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                  +

                  When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/nodeIOErrors.html b/branch-3.9/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..481d27084 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  I/O Errors can indicate a node with a faulty disk

                  +

                  I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/nodeLocalErrors.html b/branch-3.9/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..aa6d9095c --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Some operations failed on the replica side

                  +

                  ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                  +

                  An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-3.9/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..9f659e0d8 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  CQL queries are not balanced among shards

                  +

                  For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                  +

                  There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                  +
                  +

                  Blog post link

                  +

                  https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/preparedCacheEviction.html b/branch-3.9/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..d50873993 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Prepared statements cache eviction

                  +

                  Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                  +
                    +
                  • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                  • +
                  • The prepared statements cache might be too small for the number of prepared statements.

                  • +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/cql_optimization.html b/branch-3.9/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..3cdcb76ab --- /dev/null +++ b/branch-3.9/use-monitoring/cql_optimization.html @@ -0,0 +1,798 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  The CQL Optimization

                  +

                  The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver.

                  +
                  +../_images/cql_optimization_master.png +
                  +

                  The CQL Dashboard

                  +
                  +
                  +

                  The upper part of the dashboard holds CQL related metrics.

                  +

                  The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                  +
                  +

                  Note

                  +

                  Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                  +
                  +

                  The following sections describe each of the dashboard’s panel

                  +
                  +

                  Prepared Statements

                  +

                  Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                  +

                  Using prepared statements has the following benefits:

                  +
                    +
                  • The database only needs to parse the query once

                  • +
                  • The driver can route the query to the right node

                  • +
                  • Using place-holders and values is safer and prevents CQL-Injection

                  • +
                  +

                  The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                  +

                  The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                  +
                  +
                  +

                  Token Aware

                  +

                  Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                  +

                  Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                  +

                  The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                  +

                  The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                  +
                  +
                  +

                  Paged Queries

                  +

                  By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                  +

                  The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                  +

                  The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                  +
                  +
                  +

                  Reversed CQL Reads

                  +

                  Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                  +

                  Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                  +

                  For example, look at the following table:

                  +
                  CREATE TABLE ks1.table_demo (
                  +   category text,
                  +   type int,
                  +   PRIMARY KEY (category, type))
                  +WITH CLUSTERING ORDER BY (type DESC);
                  +
                  +
                  +

                  The following query uses reverse order:

                  +
                  select * from ks1.table_demo where category='cat1' order by type ASC;
                  +
                  +
                  +

                  The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                  +

                  The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                  +
                  +
                  +

                  ALLOW FILTERING

                  +

                  Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                  +

                  These kinds of queries can create a big load on the system, and should be used with care.

                  +

                  The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                  +

                  The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                  +

                  The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                  +

                  The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                  +

                  The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                  +
                  +
                  +

                  Consistency Level

                  +

                  Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                  +

                  The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                  +

                  Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                  +

                  The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                  +

                  The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                  +

                  The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                  +

                  The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                  +
                  +
                  +

                  Cross DC

                  +

                  Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                  +
                  +
                  +

                  Cross DC Consistency Level

                  +

                  Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                  +
                  +
                  +

                  Cross DC read requests

                  +
                  +

                  Note

                  +

                  The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                  +
                  +

                  In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                  +

                  The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/index.html b/branch-3.9/use-monitoring/index.html new file mode 100644 index 000000000..9de1d3e51 --- /dev/null +++ b/branch-3.9/use-monitoring/index.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Using Scylla Monitoring Stack

                  +
                  +
                  +

                  There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-4.0/.buildinfo b/branch-4.0/.buildinfo new file mode 100644 index 000000000..f216da316 --- /dev/null +++ b/branch-4.0/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 06b5320b06fb085ce22a7544c2830a12 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.0/.doctrees/_common/monitor-description.doctree b/branch-4.0/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..bd93124aa Binary files /dev/null and b/branch-4.0/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-4.0/.doctrees/environment.pickle b/branch-4.0/.doctrees/environment.pickle new file mode 100644 index 000000000..c8ade2434 Binary files /dev/null and b/branch-4.0/.doctrees/environment.pickle differ diff --git a/branch-4.0/.doctrees/index.doctree b/branch-4.0/.doctrees/index.doctree new file mode 100644 index 000000000..2bd01b602 Binary files /dev/null and b/branch-4.0/.doctrees/index.doctree differ diff --git a/branch-4.0/.doctrees/install/docker_compose.doctree b/branch-4.0/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..ebec06d72 Binary files /dev/null and b/branch-4.0/.doctrees/install/docker_compose.doctree differ diff --git a/branch-4.0/.doctrees/install/index.doctree b/branch-4.0/.doctrees/install/index.doctree new file mode 100644 index 000000000..9fb15d4ae Binary files /dev/null and b/branch-4.0/.doctrees/install/index.doctree differ diff --git a/branch-4.0/.doctrees/install/min-prod-hw.doctree b/branch-4.0/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..c0d694109 Binary files /dev/null and b/branch-4.0/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.0/.doctrees/install/monitor_without_docker.doctree b/branch-4.0/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..da6af35ee Binary files /dev/null and b/branch-4.0/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-4.0/.doctrees/install/monitoring_stack.doctree b/branch-4.0/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..d25e3dcb3 Binary files /dev/null and b/branch-4.0/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-4.0/.doctrees/install/start_all.doctree b/branch-4.0/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..a57a68580 Binary files /dev/null and b/branch-4.0/.doctrees/install/start_all.doctree differ diff --git a/branch-4.0/.doctrees/install/thanos.doctree b/branch-4.0/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..37db73b50 Binary files /dev/null and b/branch-4.0/.doctrees/install/thanos.doctree differ diff --git a/branch-4.0/.doctrees/intro.doctree b/branch-4.0/.doctrees/intro.doctree new file mode 100644 index 000000000..408aacff6 Binary files /dev/null and b/branch-4.0/.doctrees/intro.doctree differ diff --git a/branch-4.0/.doctrees/procedures/alerts/alerting.doctree b/branch-4.0/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..b88809512 Binary files /dev/null and b/branch-4.0/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.0/.doctrees/procedures/alerts/index.doctree b/branch-4.0/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..60c85e664 Binary files /dev/null and b/branch-4.0/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.0/.doctrees/procedures/index.doctree b/branch-4.0/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..cddb62a29 Binary files /dev/null and b/branch-4.0/.doctrees/procedures/index.doctree differ diff --git a/branch-4.0/.doctrees/procedures/updating_dashboard.doctree b/branch-4.0/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..8120b9d72 Binary files /dev/null and b/branch-4.0/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-4.0/.doctrees/reference/index.doctree b/branch-4.0/.doctrees/reference/index.doctree new file mode 100644 index 000000000..1c77256b8 Binary files /dev/null and b/branch-4.0/.doctrees/reference/index.doctree differ diff --git a/branch-4.0/.doctrees/reference/matrix.doctree b/branch-4.0/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..eec170223 Binary files /dev/null and b/branch-4.0/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.0/.doctrees/reference/monitoring_apis.doctree b/branch-4.0/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..206ad2791 Binary files /dev/null and b/branch-4.0/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-4.0/.doctrees/troubleshooting/index.doctree b/branch-4.0/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..af18a3dfd Binary files /dev/null and b/branch-4.0/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.0/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-4.0/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..b368df740 Binary files /dev/null and b/branch-4.0/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/index.doctree b/branch-4.0/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..8f3b79666 Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..5479da9b1 Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..6e051937c Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..ad4c74498 Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..c51774f67 Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..b6d65b714 Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..f371d0afe Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..e27700d02 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..4bac77ea0 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..05a2dd071 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..7b75c0c7a Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..fdfcc483d Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..c067f11ca Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..a41f116da Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..c8721eef2 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..90662aa2c Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..8e7905c07 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..58120ada2 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..be5a03cf9 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..5edf1fb11 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..5e9fd2b2c Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/cql_optimization.doctree b/branch-4.0/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..bef045011 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/index.doctree b/branch-4.0/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..fb31552c8 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.0/.nojekyll b/branch-4.0/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.0/404.html b/branch-4.0/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.0/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                  +

                  404

                  +

                  The ScyllaDB monster ate your page!

                  +

                  + Home +

                  +
                  + + + \ No newline at end of file diff --git a/branch-4.0/CNAME b/branch-4.0/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.0/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.0/_common/monitor-description.html b/branch-4.0/_common/monitor-description.html new file mode 100644 index 000000000..93505dad3 --- /dev/null +++ b/branch-4.0/_common/monitor-description.html @@ -0,0 +1,653 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +

                  Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                  + + +
                  + + + + + +
                  + + +
                  + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-4.0/_images/1.png b/branch-4.0/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.0/_images/1.png differ diff --git a/branch-4.0/_images/2.png b/branch-4.0/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.0/_images/2.png differ diff --git a/branch-4.0/_images/3.png b/branch-4.0/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.0/_images/3.png differ diff --git a/branch-4.0/_images/advisor_panel.png b/branch-4.0/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-4.0/_images/advisor_panel.png differ diff --git a/branch-4.0/_images/after-backfilling.jpg b/branch-4.0/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.0/_images/after-backfilling.jpg differ diff --git a/branch-4.0/_images/alertmanager.png b/branch-4.0/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.0/_images/alertmanager.png differ diff --git a/branch-4.0/_images/before-backfilling.png b/branch-4.0/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.0/_images/before-backfilling.png differ diff --git a/branch-4.0/_images/cql_optimization_master.png b/branch-4.0/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.0/_images/cql_optimization_master.png differ diff --git a/branch-4.0/_images/grafana.png b/branch-4.0/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.0/_images/grafana.png differ diff --git a/branch-4.0/_images/monitor.png b/branch-4.0/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-4.0/_images/monitor.png differ diff --git a/branch-4.0/_images/monitoring_stack.png b/branch-4.0/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.0/_images/monitoring_stack.png differ diff --git a/branch-4.0/_images/monitoring_stack1.png b/branch-4.0/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.0/_images/monitoring_stack1.png differ diff --git a/branch-4.0/_sources/_common/monitor-description.rst.txt b/branch-4.0/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-4.0/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-4.0/_sources/index.rst.txt b/branch-4.0/_sources/index.rst.txt new file mode 100644 index 000000000..9233bc21d --- /dev/null +++ b/branch-4.0/_sources/index.rst.txt @@ -0,0 +1,42 @@ +======================== +Scylla Monitoring Stack +======================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `Scylla Monitoring Stack lesson `_ on Scylla University +* `Scylla Monitoring Stack GitHub Project `_ + +For older versions of Scylla Monitoring Stack Documentation see `here `_. \ No newline at end of file diff --git a/branch-4.0/_sources/install/docker_compose.rst.txt b/branch-4.0/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.0/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.0/_sources/install/index.rst.txt b/branch-4.0/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-4.0/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.0/_sources/install/min-prod-hw.rst.txt b/branch-4.0/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..443638374 --- /dev/null +++ b/branch-4.0/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,32 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. diff --git a/branch-4.0/_sources/install/monitor_without_docker.rst.txt b/branch-4.0/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..08b771b73 --- /dev/null +++ b/branch-4.0/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.0/_sources/install/monitoring_stack.rst.txt b/branch-4.0/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..b0f466b32 --- /dev/null +++ b/branch-4.0/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,389 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API `_ + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker ` . +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.0/_sources/install/start_all.rst.txt b/branch-4.0/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..c2e927a99 --- /dev/null +++ b/branch-4.0/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.0/_sources/install/thanos.rst.txt b/branch-4.0/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.0/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.0/_sources/intro.rst.txt b/branch-4.0/_sources/intro.rst.txt new file mode 100644 index 000000000..8bad4d48a --- /dev/null +++ b/branch-4.0/_sources/intro.rst.txt @@ -0,0 +1,49 @@ +======================= +Scylla Monitoring Stack +======================= + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the `node_exporter` agent that runs on the Scylla server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + + +For older versions of Scylla Monitoring Stack Documentation see `here `_. diff --git a/branch-4.0/_sources/procedures/alerts/alerting.rst.txt b/branch-4.0/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.0/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.0/_sources/procedures/alerts/index.rst.txt b/branch-4.0/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.0/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.0/_sources/procedures/index.rst.txt b/branch-4.0/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..5ad1f631f --- /dev/null +++ b/branch-4.0/_sources/procedures/index.rst.txt @@ -0,0 +1,18 @@ +========================================= +Scylla Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Alert Manager + Adding and Modifying Dashboards + Upgrade Guide + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* `Upgrade Guide `_ diff --git a/branch-4.0/_sources/procedures/updating_dashboard.rst.txt b/branch-4.0/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.0/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.0/_sources/reference/index.rst.txt b/branch-4.0/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-4.0/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.0/_sources/reference/matrix.rst.txt b/branch-4.0/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..ca9bd522b --- /dev/null +++ b/branch-4.0/_sources/reference/matrix.rst.txt @@ -0,0 +1,125 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.0/_sources/reference/monitoring_apis.rst.txt b/branch-4.0/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..ce53e9d8f --- /dev/null +++ b/branch-4.0/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring_stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.0/_sources/troubleshooting/index.rst.txt b/branch-4.0/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-4.0/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-4.0/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-4.0/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..a2e14a1f4 --- /dev/null +++ b/branch-4.0/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,221 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.0/_sources/upgrade/index.rst.txt b/branch-4.0/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..817f65247 --- /dev/null +++ b/branch-4.0/_sources/upgrade/index.rst.txt @@ -0,0 +1,42 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                  +
                  +
                  +
                  Upgrade Scylla Open Source
                  +
                  +
                  + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                  +
                  +
                  diff --git a/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..0e4fd3baa --- /dev/null +++ b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,103 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + + + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade
                  ` +* `Prometheus Migration `_ diff --git a/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..3bb8af42b --- /dev/null +++ b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,132 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..d1974adfc --- /dev/null +++ b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,63 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..a356f5c21 --- /dev/null +++ b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,138 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..b64fd5d7e --- /dev/null +++ b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,281 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-4.0/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.0/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.0/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.0/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.0/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.0/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.0/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.0/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.0/_sources/use-monitoring/cql_optimization.rst.txt b/branch-4.0/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.0/_sources/use-monitoring/index.rst.txt b/branch-4.0/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.0/_static/basic.css b/branch-4.0/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.0/_static/check-solid.svg b/branch-4.0/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.0/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.0/_static/clipboard.min.js b/branch-4.0/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.0/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.0/_static/copybutton.css b/branch-4.0/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.0/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                  Short

                  + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.0/_static/copybutton.js b/branch-4.0/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.0/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.0/_static/copybutton_funcs.js b/branch-4.0/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.0/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.0/_static/css/main.css b/branch-4.0/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-4.0/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.0/_static/doctools.js b/branch-4.0/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.0/_static/documentation_options.js b/branch-4.0/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.0/_static/file.png b/branch-4.0/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.0/_static/file.png differ diff --git a/branch-4.0/_static/img/banner-background.svg b/branch-4.0/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.0/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.0/_static/img/favicon-228x228.png b/branch-4.0/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.0/_static/img/favicon-228x228.png differ diff --git a/branch-4.0/_static/img/favicon-32x32.png b/branch-4.0/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.0/_static/img/favicon-32x32.png differ diff --git a/branch-4.0/_static/img/favicon.ico b/branch-4.0/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.0/_static/img/favicon.ico differ diff --git a/branch-4.0/_static/img/icons/icon-about-team.svg b/branch-4.0/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.0/_static/img/icons/icon-about-us-m.svg b/branch-4.0/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-about-us.svg b/branch-4.0/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-alternator.svg b/branch-4.0/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-apps.svg b/branch-4.0/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-architecture.svg b/branch-4.0/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.0/_static/img/icons/icon-benchmarks.svg b/branch-4.0/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.0/_static/img/icons/icon-blog.svg b/branch-4.0/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.0/_static/img/icons/icon-careers.svg b/branch-4.0/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.0/_static/img/icons/icon-chevron-left.svg b/branch-4.0/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.0/_static/img/icons/icon-chevron-right.svg b/branch-4.0/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.0/_static/img/icons/icon-circe.svg b/branch-4.0/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-clock.svg b/branch-4.0/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-close.svg b/branch-4.0/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-cloud-docs.svg b/branch-4.0/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-cloud.svg b/branch-4.0/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-comparison.svg b/branch-4.0/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.0/_static/img/icons/icon-contact-us.svg b/branch-4.0/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.0/_static/img/icons/icon-developers-blog.svg b/branch-4.0/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.0/_static/img/icons/icon-docs.svg b/branch-4.0/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.0/_static/img/icons/icon-enterprise-m.svg b/branch-4.0/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-enterprise.svg b/branch-4.0/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-events.svg b/branch-4.0/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.0/_static/img/icons/icon-exclamation.svg b/branch-4.0/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-expand.svg b/branch-4.0/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-forum.svg b/branch-4.0/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-getting-started.svg b/branch-4.0/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-glossary.svg b/branch-4.0/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-home.svg b/branch-4.0/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-infoworld.svg b/branch-4.0/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.0/_static/img/icons/icon-integrations.svg b/branch-4.0/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-knowledge-base.svg b/branch-4.0/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-less.svg b/branch-4.0/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-live-test.svg b/branch-4.0/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.0/_static/img/icons/icon-mail-list.svg b/branch-4.0/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-manager.svg b/branch-4.0/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.0/_static/img/icons/icon-memory-management.svg b/branch-4.0/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.0/_static/img/icons/icon-modeling.svg b/branch-4.0/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-monitoring.svg b/branch-4.0/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.0/_static/img/icons/icon-networking.svg b/branch-4.0/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.0/_static/img/icons/icon-news.svg b/branch-4.0/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.0/_static/img/icons/icon-newsletter.svg b/branch-4.0/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.0/_static/img/icons/icon-nsql-guides.svg b/branch-4.0/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.0/_static/img/icons/icon-open-source.svg b/branch-4.0/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.0/_static/img/icons/icon-operator.svg b/branch-4.0/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-overview.svg b/branch-4.0/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.0/_static/img/icons/icon-partners.svg b/branch-4.0/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.0/_static/img/icons/icon-plus.svg b/branch-4.0/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-pricing.svg b/branch-4.0/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.0/_static/img/icons/icon-release-notes.svg b/branch-4.0/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.0/_static/img/icons/icon-resource-center.svg b/branch-4.0/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.0/_static/img/icons/icon-roadmap.svg b/branch-4.0/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.0/_static/img/icons/icon-search.svg b/branch-4.0/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.0/_static/img/icons/icon-slack.svg b/branch-4.0/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-stack-overflow.svg b/branch-4.0/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.0/_static/img/icons/icon-summit.svg b/branch-4.0/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-support.svg b/branch-4.0/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.0/_static/img/icons/icon-tech-talks.svg b/branch-4.0/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.0/_static/img/icons/icon-testing.svg b/branch-4.0/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.0/_static/img/icons/icon-thumbs-down.svg b/branch-4.0/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-thumbs-up.svg b/branch-4.0/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-tip.svg b/branch-4.0/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.0/_static/img/icons/icon-training.svg b/branch-4.0/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.0/_static/img/icons/icon-triangle-down.svg b/branch-4.0/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.0/_static/img/icons/icon-university.svg b/branch-4.0/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.0/_static/img/icons/icon-users-blog.svg b/branch-4.0/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.0/_static/img/icons/icon-warning.svg b/branch-4.0/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-webinars.svg b/branch-4.0/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.0/_static/img/icons/icon-whitepapers.svg b/branch-4.0/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.0/_static/img/icons/icon-workshop.svg b/branch-4.0/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/logo-docs.svg b/branch-4.0/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.0/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.0/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.0/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.0/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.0/_static/img/mascots/404.jpg b/branch-4.0/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.0/_static/img/mascots/404.jpg differ diff --git a/branch-4.0/_static/img/mascots/scylla-3monsters.png b/branch-4.0/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.0/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-alternator.svg b/branch-4.0/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.0/_static/img/mascots/scylla-cloud.svg b/branch-4.0/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.0/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.0/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-computer-headset.png b/branch-4.0/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-cup-number-one.png b/branch-4.0/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-docs.svg b/branch-4.0/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.0/_static/img/mascots/scylla-drivers.svg b/branch-4.0/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.0/_static/img/mascots/scylla-enterprise.svg b/branch-4.0/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.0/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.0/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-forklift-migration.png b/branch-4.0/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-gear.png b/branch-4.0/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-hardhat.png b/branch-4.0/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-headband.png b/branch-4.0/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-headset.png b/branch-4.0/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-hearts.png b/branch-4.0/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-looking-down.png b/branch-4.0/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-looking-up.png b/branch-4.0/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.0/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.0/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-manager.svg b/branch-4.0/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.0/_static/img/mascots/scylla-monitor.svg b/branch-4.0/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.0/_static/img/mascots/scylla-movement-fast.png b/branch-4.0/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-movement.png b/branch-4.0/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-onpremise.png b/branch-4.0/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-opensource.svg b/branch-4.0/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.0/_static/img/mascots/scylla-operator.svg b/branch-4.0/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.0/_static/img/mascots/scylla-plugin.png b/branch-4.0/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-release-mascot.png b/branch-4.0/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-repair.png b/branch-4.0/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-server.png b/branch-4.0/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-sleeping.png b/branch-4.0/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-tall-measure.png b/branch-4.0/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-university.png b/branch-4.0/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-weights.png b/branch-4.0/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-window-cleaning.png b/branch-4.0/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-with-computer-2.png b/branch-4.0/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-with-computer.png b/branch-4.0/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-with-linux.png b/branch-4.0/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-writting.png b/branch-4.0/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.0/_static/img/menu.svg b/branch-4.0/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.0/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.0/_static/img/scylla-monitor.png b/branch-4.0/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.0/_static/img/scylla-monitor.png differ diff --git a/branch-4.0/_static/js/main.bundle.js b/branch-4.0/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-4.0/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
                • Back
                • ',backButtonPosition:"top",wrapper:"
                  ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                    "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                    ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                    ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                    ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                    ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                    "],col:[2,"","
                    "],tr:[2,"","
                    "],td:[3,"","
                    "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + + + +
                    + + + + + +
                    + + +
                    + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/index.html b/branch-4.0/index.html new file mode 100644 index 000000000..c6eb8b069 --- /dev/null +++ b/branch-4.0/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack

                    +
                    +
                    +

                    Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                    +_images/monitor.png +

                    The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

                    +
                      +
                    • prometheus - collects and stores metrics

                    • +
                    • alertmanager - handles alerts

                    • +
                    • grafana - dashboard server

                    • +
                    +

                    Choose a topic to get started:

                    + +

                    For older versions of Scylla Monitoring Stack Documentation see here.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/docker_compose.html b/branch-4.0/install/docker_compose.html new file mode 100644 index 000000000..247456055 --- /dev/null +++ b/branch-4.0/install/docker_compose.html @@ -0,0 +1,817 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Using Docker Compose

                    +

                    Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                    +

                    Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                    +
                    +

                    Warning

                    +

                    docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                    +
                    +
                    +

                    Prerequisite

                    +

                    Make sure you have docker and docker-compose installed.

                    +
                    +
                    +

                    Setting Prometheus

                    +

                    The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                    +

                    You can use ./prometheus-config.sh to generate the file, for example:

                    +
                    ./prometheus-config.sh --compose
                    +
                    +
                    +

                    For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                    +
                    +
                    +

                    Setting Grafana Provisioning

                    +

                    Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                    +
                    +

                    Grafana Data-Source file

                    +

                    Run the following command to update the datasource:

                    +
                    ./grafana-datasource.sh --compose
                    +
                    +
                    +

                    You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                    +
                    +
                    +

                    Grafana Dashboard Load file

                    +

                    To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                    +
                    ./generate-dashboards.sh -t -v 2020.1
                    +
                    +
                    +

                    This command generates the files under: grafana/provisioning/dashboards/

                    +
                    +
                    +
                    +

                    Docker Compose file

                    +

                    You can use the following example as a base for your docker compose.

                    +

                    Pass the following to a file called docker-compose.yml

                    +
                    services:
                    +  alertmanager:
                    +    container_name: aalert
                    +    image: prom/alertmanager:v0.21.0
                    +    ports:
                    +    - 9093:9093
                    +    volumes:
                    +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                    +  grafana:
                    +    container_name: agraf
                    +    environment:
                    +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                    +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                    +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                    +    # This is where you set Grafana security
                    +    - GF_AUTH_BASIC_ENABLED=false
                    +    - GF_AUTH_ANONYMOUS_ENABLED=true
                    +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                    +    - GF_SECURITY_ADMIN_PASSWORD=admin
                    +    image: grafana/grafana:7.3.5
                    +    ports:
                    +    - 3000:3000
                    +    user: 1000:1000
                    +    volumes:
                    +    - ./grafana/build:/var/lib/grafana/dashboards
                    +    - ./grafana/plugins:/var/lib/grafana/plugins
                    +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                    +    # Uncomment the following line for grafana persistency
                    +    # - path/to/grafana/dir:/var/lib/grafana
                    +  loki:
                    +    command:
                    +    - --config.file=/mnt/config/loki-config.yaml
                    +    container_name: loki
                    +    image: grafana/loki:2.0.0
                    +    ports:
                    +    - 3100:3100
                    +    volumes:
                    +    - ./loki/rules:/etc/loki/rules
                    +    - ./loki/conf:/mnt/config
                    +  prometheus:
                    +    command:
                    +    - --config.file=/etc/prometheus/prometheus.compose.yml
                    +    container_name: aprom
                    +    image: prom/prometheus:v2.18.1
                    +    ports:
                    +    - 9090:9090
                    +    volumes:
                    +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                    +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                    +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                    +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                    +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                    +    # Uncomment the following line for prometheus persistency 
                    +    # - path/to/data/dir:/prometheus/data
                    +  promtail:
                    +    command:
                    +    - --config.file=/etc/promtail/config.yml
                    +    container_name: promtail
                    +    image: grafana/promtail:2.0.0
                    +    ports:
                    +    - 1514:1514
                    +    - 9080:9080
                    +    volumes:
                    +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                    +version: '3'
                    +
                    +
                    +
                    +

                    Start and Stop

                    +

                    To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/index.html b/branch-4.0/install/index.html new file mode 100644 index 000000000..90074d657 --- /dev/null +++ b/branch-4.0/install/index.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Download and Install Scylla Monitoring Stack

                    +
                    +
                    +

                    Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                    +

                    Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/min-prod-hw.html b/branch-4.0/install/min-prod-hw.html new file mode 100644 index 000000000..2aee7f5bd --- /dev/null +++ b/branch-4.0/install/min-prod-hw.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Minimal Production System Recommendations

                    +
                      +
                    • CPU - at least 2 physical cores/ 4vCPUs

                    • +
                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                    • +
                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                    • +
                    • Network - 1GbE/10GbE preferred

                    • +
                    +
                    +

                    Calculating Prometheus Minimal Disk Space requirement

                    +

                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                    +

                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                    +

                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                    +
                    6 * 16 * 15 * 12MB ~ 16GB
                    +
                    +
                    +

                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                    +
                    +
                    +

                    Calculating Prometheus Minimal Memory Space requirement

                    +

                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                    +

                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/monitor_without_docker.html b/branch-4.0/install/monitor_without_docker.html new file mode 100644 index 000000000..5792ccf6a --- /dev/null +++ b/branch-4.0/install/monitor_without_docker.html @@ -0,0 +1,1123 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Deploying Scylla Monitoring Stack Without Docker

                    +
                    +

                    Introduction

                    +

                    The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                    +

                    Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                    +

                    Scylla Monitoring uses the following components:

                    +
                      +
                    • Alertmanager

                    • +
                    • Grafana Loki

                    • +
                    • Prometheus

                    • +
                    • Grafana

                    • +
                    +

                    The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                    +

                    We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                    +
                    +
                    +

                    Minimal Production System Recommendations

                    +
                      +
                    • CPU - at least 2 physical cores/ 4vCPUs

                    • +
                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                    • +
                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                    • +
                    • Network - 1GbE/10GbE preferred

                    • +
                    +
                    +

                    Calculating Prometheus Minimal Disk Space requirement

                    +

                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                    +

                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                    +

                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                    +
                    6 * 16 * 15 * 12MB ~ 16GB
                    +
                    +
                    +

                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                    +
                    +
                    +

                    Calculating Prometheus Minimal Memory Space requirement

                    +

                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                    +

                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                    +

                    The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                    +
                    +

                    Note

                    +

                    Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                    +
                    +
                    +
                    +
                    +

                    Install Scylla Monitoring Stack

                    +

                    The following procedure uses a CentOS 7 based instance

                    +
                      +
                    1. Download the latest Scylla Monitoring Stack release.

                    2. +
                    +
                    wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.0.2.tar.gz
                    +
                    +
                    +
                      +
                    1. Open the tar

                    2. +
                    +

                    tar -xvf scylla-monitoring-*.tar.gz

                    +
                    +
                    +

                    Install Alertmanager

                    +

                    Tested with alertmanager 0.22.2 version

                    +
                      +
                    1. Install alertmanager

                    2. +
                    +
                    wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                    +tar -xvf alertmanager-*.linux-amd64.tar.gz
                    +
                    +
                    +
                      +
                    1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                    2. +
                    +

                    For example:

                    +
                    cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.0.2/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                    +
                    +
                    +
                      +
                    1. Start the Alertmanager

                    2. +
                    +

                    For example:

                    +
                    cd alertmanager-0.22.2.linux-amd64
                    +./alertmanager
                    +
                    +
                    +
                      +
                    1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                    2. +
                    +

                    For example:

                    +
                    http://192.168.135.166:9093/
                    +
                    +
                    +../_images/alertmanager.png +
                    +
                    +

                    Install Grafana Loki

                    +

                    Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                    +

                    We recomand using Loki with containers, but you can install it locally as described in Loki installation

                    +

                    You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                    +

                    Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                    +

                    Loki Related files

                    +

                    Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                    +
                    mkdir -p /etc/loki/rules
                    +mkdir -p /etc/loki/config
                    +cp loki/rules/* /etc/loki/rules
                    +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                    +
                    +
                    +

                    Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                    +

                    Promtail Related files

                    +

                    Promtail has a configuration file. You need to copy and modify the configuration.

                    +
                    mkdir -p /etc/promtail/
                    +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                    +
                    +
                    +

                    Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                    +
                    +
                    +

                    Install Prometheus

                    +

                    Tested with Prometheus version 2.27.1

                    +
                    +

                    Note

                    +

                    If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                    +
                    +
                      +
                    1. Install Prometheus

                    2. +
                    +
                    wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                    +tar -xvf prometheus-*.linux-amd64.tar.gz
                    +
                    +
                    +

                    2. Create Data and Config directories +.. code-block:: shell

                    +
                    +

                    mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                    +
                    +
                      +
                    1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                    2. +
                    +

                    Copy prometheus/prometheus.yml.template to prometheus.yml

                    +

                    For example:

                    +
                    cp scylla-monitoring-scylla-monitoring-4.0.2/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/
                    +cp scylla-monitoring-scylla-monitoring-4.0.2/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                    +
                    +
                    +
                      +
                    1. Edit the prometheus.yml file to point to the correct static data sources.

                    2. +
                    +
                    +

                    Note

                    +

                    Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                    +
                    +
                    vi /etc/prometheus/prometheus.yml
                    +
                    +
                    +

                    Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                    +

                    For example if the alertmanager will run on the same host:

                    +
                    alerting:
                    +   alertmanagers:
                    +   - static_configs:
                    +       - targets:
                    +           - 127.0.0.1:9093
                    +
                    +
                    +

                    Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                    +

                    For example the scrape config for Scylla:

                    +
                    global:
                    +  scrape_interval: 5s # By default, scrape targets every 5 second.
                    +  scrape_timeout: 4s # Timeout before trying to scape a target again
                    +
                    +  # Attach these labels to any time series or alerts when communicating with
                    +  # external systems (federation, remote storage, Alertmanager).
                    +  external_labels:
                    +    monitor: 'scylla-monitor'
                    +
                    +scrape_configs:
                    +- job_name: scylla
                    +  honor_labels: false
                    +  file_sd_configs:
                    +    - files:
                    +      - /etc/scylla.d/prometheus/scylla_servers.yml
                    +  relabel_configs:
                    +    - source_labels: [__address__]
                    +      regex:  '([^:]+)'
                    +      target_label: __address__
                    +      replacement: '${1}:9180'
                    +
                    +    - source_labels: [__address__]
                    +      regex:  '(.*):.+'
                    +      target_label: instance
                    +      replacement: '${1}'
                    +
                    +
                    +
                      +
                    1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                    2. +
                    +
                    +

                    Note

                    +

                    There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                    +
                    +

                    An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                    +
                    +

                    Note

                    +

                    You must have both files even if you are not using Scylla Manager

                    +
                    +

                    Add the labels for the cluster and data-center

                    +

                    scylla_servers.yml:

                    +

                    For example:

                    +
                    cat scylla_servers.yml
                    +# List Scylla end points
                    +
                    +- targets:
                    +  - 192.168.66.6
                    +  - 192.168.66.244
                    +  labels:
                    +    cluster: cluster1
                    +    dc: dc1
                    +- targets:
                    +    - 172.17.0.3
                    +  labels:
                    +    cluster: cluster1
                    +    dc: dc2
                    +
                    +
                    +
                    +

                    Note

                    +

                    See the previous note about deprecating the node_exporter_servers.yml file.

                    +
                    +

                    scylla_manager_server.yml

                    +

                    For example:

                    +
                    - targets:
                    +  - 127.0.0.1:5090
                    +
                    +
                    +
                      +
                    1. Start Prometheus server:

                    2. +
                    +

                    For example:

                    +
                    cd scylla-monitoring-scylla-monitoring-4.0.2/
                    +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                    +
                    +
                    +

                    Data should start accumulate on: /prometheus/data

                    +
                      +
                    1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                    2. +
                    +

                    For example:

                    +
                    http://192.168.135.166:9090/
                    +
                    +
                    +../_images/1.png +

                    Prometheus console should be visible

                    +
                      +
                    1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                    2. +
                    +

                    For example:

                    +

                    node_memory_MemFree

                    +../_images/2.png +

                    And

                    +

                    scylla_reactor_utilization

                    +../_images/3.png +

                    At this point Scylla is emitting the metrics and Prometheus is able to store them.

                    +
                    +
                    +

                    Install Grafana

                    +

                    Tested with Grafna 7.5.7

                    +
                      +
                    1. Install Grafana based on the instructions here

                    2. +
                    +

                    Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                    +
                      +
                    1. Access Scylla-Grafana-monitoring directory

                    2. +
                    +
                    cd scylla-monitoring-scylla-monitoring-4.0.2/
                    +
                    +
                    +
                      +
                    1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                    2. +
                    +
                    sudo cp -r grafana/plugins /var/lib/grafana/
                    +
                    +
                    +

                    If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                    +

                    For example:

                    +
                    cp -r grafana/plugins ../grafana-7.5.7/public/app
                    +
                    +
                    +
                      +
                    1. Provision the Dashboards

                    2. +
                    +

                    For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                    +

                    For Grafana installed with yum install

                    +
                    sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                    +sudo mkdir -p /var/lib/grafana/dashboards
                    +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                    +
                    +
                    +

                    For Grafana installed from packages

                    +
                    cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                    +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                    +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                    +
                    +
                    +

                    Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                    +
                    +

                    Note

                    +

                    A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                    +
                    +
                      +
                    1. Set the data source by copy datasource.yml and edit it

                    2. +
                    +
                    sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                    +
                    +
                    +
                    +

                    Note

                    +

                    Scylla uses a plugin to read from some system tables see the section below about using it.

                    +
                    +

                    For Grafana installed from packages

                    +
                    cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                    +
                    +
                    +

                    You should set the Prometheus and the alertmanager IP and port.

                    +

                    For example

                    +
                    sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                    +apiVersion: 1
                    +datasources:
                    + - name: prometheus
                    +   type: prometheus
                    +   url: http://192.168.135.167:9090
                    +   access: proxy
                    +   basicAuth: false
                    +
                    + - name: alertmanager
                    +   type: camptocamp-prometheus-alertmanager-datasource
                    +   orgId: 1
                    +   typeLogoUrl: public/img/icn-datasource.svg
                    +   access: proxy
                    +   url: http://192.168.135.166:9093
                    +   password:
                    +   user:
                    +   database:
                    +   basicAuth:
                    +   isDefault:
                    +   jsonData:
                    +     severity_critical: '4'
                    +     severity_high: '3'
                    +     severity_warning: '2'
                    +     severity_info: '1'
                    +
                    +
                    +
                      +
                    1. Start the Grafana service

                    2. +
                    +

                    For Grafana installed with yum install

                    +

                    sudo service grafana-server start

                    +

                    For Grafana installed from packages:

                    +

                    cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                    +

                    Edit scylla.ini to reflect the right paths in the paths section of the file.

                    +
                    plugins = /home/centos/grafana-7.5.7/data/plugins
                    +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                    +
                    +
                    +

                    Start the server:

                    +
                    cd /home/centos/grafana-7.5.7/
                    +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                    +
                    +
                    +
                      +
                    1. Make sure Grafana is running

                    2. +
                    +

                    Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                    +../_images/grafana.png +
                    +
                    +

                    Using Scylla Plugin with Grafana

                    +

                    Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                    +

                    Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                    +
                    +

                    Setting a monitoring user

                    +

                    This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                    +
                      +
                    • If you have not done so, enable authorization first.

                    • +
                    • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                    • +
                    • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                    • +
                    +
                    +
                    +

                    Installing the Plugin

                    +

                    Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                    +
                    +
                    +

                    Configure the Plugin

                    +

                    Add an entry to the datasource.yml file

                    +
                    - name: scylla-datasource
                    +  type: scylladb-scylla-datasource
                    +  orgId: 1
                    +  isDefault:
                    +  jsonData:
                    +  host: ''
                    +#  secureJsonData:
                    +#    user: 'scylla_monitoring'
                    +#    password: 'scylla_monitoring'
                    +
                    +
                    +

                    As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                    +
                    +
                    +

                    Enable the Plugin

                    +

                    Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                    +

                    See more about it the Grafana configurtion.

                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/monitoring_stack.html b/branch-4.0/install/monitoring_stack.html new file mode 100644 index 000000000..a6b7844ba --- /dev/null +++ b/branch-4.0/install/monitoring_stack.html @@ -0,0 +1,1041 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Install Scylla Monitoring Stack

                    +

                    This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API

                    +

                    The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                    +

                    For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                    +
                    +

                    Minimal Production System Recommendations

                    +
                      +
                    • CPU - at least 2 physical cores/ 4vCPUs

                    • +
                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                    • +
                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                    • +
                    • Network - 1GbE/10GbE preferred

                    • +
                    +
                    +

                    Calculating Prometheus Minimal Disk Space requirement

                    +

                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                    +

                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                    +

                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                    +
                    6 * 16 * 15 * 12MB ~ 16GB
                    +
                    +
                    +

                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                    +
                    +
                    +

                    Calculating Prometheus Minimal Memory Space requirement

                    +

                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                    +

                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                    +
                    +
                    +
                    +

                    Prerequisites

                    +
                      +
                    • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker .

                    • +
                    • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                    • +
                    + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    Scylla Monitoring Stack Compatibility Matrix

                    Scylla Monitoring Stack Version

                    Prometheus Version

                    Grafana Version

                    4.0

                    2.34.0

                    8.5.2

                    3.11

                    2.32.0

                    8.3.4

                    3.10

                    2.32.0

                    8.3.3

                    3.9.2

                    2.29.1

                    8.2.7

                    3.9

                    2.29.1

                    8.1.1

                    3.8

                    2.27.1

                    7.5.7

                    3.7

                    2.25.2

                    7.4.0

                    3.6

                    2.18.1

                    7.3.5

                    3.5

                    2.18.1

                    7.1.5

                    3.4

                    2.18.1

                    6.7.3

                    +
                    +
                    +

                    Docker Post Installation

                    +

                    Docker post installation guide can be found here

                    +
                    +

                    Note

                    +

                    Avoid running the container as root.

                    +
                    +

                    To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                    +
                      +
                    1. Create the Docker group.

                    2. +
                    +
                    sudo groupadd docker
                    +
                    +
                    +
                      +
                    1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                    2. +
                    +
                    sudo usermod -aG docker $USER
                    +
                    +
                    +
                      +
                    1. Start Docker by calling:

                    2. +
                    +
                    sudo systemctl enable docker
                    +
                    +
                    +
                    +
                    +

                    Install Scylla Monitoring Stack

                    +

                    Procedure

                    +
                      +
                    1. Download and extract the latest Scylla Monitoring Stack binary;.

                    2. +
                    +
                    wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.0.2.tar.gz
                    +tar -xvf scylla-monitoring-4.0.2.tar.gz
                    +cd scylla-monitoring-scylla-monitoring-4.0.2
                    +
                    +
                    +

                    As an alternative, you can clone and use the Git repository directly.

                    +
                    git clone https://github.com/scylladb/scylla-monitoring.git
                    +cd scylla-monitoring
                    +git checkout branch-4.0
                    +
                    +
                    +
                      +
                    1. Start Docker service if needed

                    2. +
                    +
                    sudo systemctl restart docker
                    +
                    +
                    +
                    +
                    +

                    Configure Scylla Monitoring Stack

                    +

                    To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                    +

                    This configuration can be done from files, or using the Consul api.

                    +

                    Scylla Manager 2.0 and higher supports the Consul API.

                    +
                    +

                    Configure Scylla nodes from files

                    +
                      +
                    1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                    2. +
                    +
                    +

                    Note

                    +

                    It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                    +
                    +

                    For example:

                    +
                    - targets:
                    +      - 172.17.0.2
                    +      - 172.17.0.3
                    +  labels:
                    +      cluster: cluster1
                    +      dc: dc1
                    +
                    +
                    +
                    +

                    Note

                    +

                    If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                    +
                    +

                    Using IPV6

                    +

                    To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                    +

                    For example:

                    +
                    - targets:
                    +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                    +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                    +  labels:
                    +      cluster: cluster1
                    +      dc: dc1
                    +
                    +
                    +
                    +

                    Note

                    +

                    For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                    +
                    +

                    For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                    +
                    +

                    Note

                    +

                    By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                    +
                    +

                    If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                    +

                    For example:

                    +
                    ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                    +
                    +
                    +

                    Mark the different Data Centers with Labels.

                    +

                    As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                    +

                    You can use the genconfig.py script to generate the server file. For example:

                    +
                    ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                    +
                    +
                    +

                    This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                    +

                    OR

                    +

                    The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                    +
                    nodetool status | ./genconfig.py -NS
                    +
                    +
                    +

                    2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                    +

                    You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                    +

                    For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                    +
                    # List Scylla Manager end points
                    +
                    +- targets:
                    +  - 172.17.0.7:5090
                    +
                    +
                    +

                    Note that you do not need to add labels to the Scylla Manager targets.

                    +
                    +
                    +

                    Configure Scylla nodes using Scylla-Manager Consul API

                    +

                    Scylla Manager 2.0 has a Consul like API.

                    +

                    When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                    +

                    For example:

                    +
                    ./start-all.sh -L 10.10.0.1
                    +
                    +
                    +
                    +

                    Note

                    +

                    If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                    +
                    +
                    +
                    +

                    Connecting Scylla-Monitoring to Scylla

                    +

                    Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                    +

                    You can limit the user to read only, currently it only read table from the system keyspace.

                    +

                    To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

                    +

                    Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

                    +
                    +
                    +

                    Use an external directory for the Prometheus data directory

                    +

                    The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                    +
                    +

                    Note

                    +

                    Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                    +
                    +

                    If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                    +

                    In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                    +
                    +
                    +

                    Add Additional Prometheus Targets

                    +

                    There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                    +

                    The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                    +

                    You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                    +
                    - job_name: 'myservice'
                    +  # Override the global default and scrape targets from this job every 5 seconds.
                    +  scrape_interval: 5s
                    +  static_configs:
                    +    - targets:
                    +      - 17.0.0.1:7000
                    +
                    +
                    +
                    +
                    +
                    +

                    Start and Stop Scylla Monitoring Stack

                    +
                    +

                    Start

                    +
                    ./start-all.sh -d prometheus_data
                    +
                    +
                    +
                    +
                    +

                    Stop

                    +
                    ./kill-all.sh
                    +
                    +
                    +
                    +
                    +

                    Start a Specific Scylla Monitoring Stack Version

                    +

                    By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                    +

                    You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                    +

                    Multiple versions are supported. For example:

                    +
                    ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                    +
                    +
                    +

                    will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                    +
                    +
                    +

                    Accessing the localhost

                    +

                    The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                    +
                    ./start-all.sh -l -d prometheus-data
                    +
                    +
                    +
                    +
                    +

                    Configure rsyslog on each Scylla node

                    +

                    generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                    +

                    Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                    +

                    Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                    +

                    If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                    +
                    if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                    +
                    +
                    +

                    Restart rsyslog for the configuration to take effect.

                    +
                    systemctl restart rsyslog
                    +
                    +
                    +
                    +
                    +
                    +

                    View Grafana Dashboards

                    +

                    Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/start_all.html b/branch-4.0/install/start_all.html new file mode 100644 index 000000000..366cb249a --- /dev/null +++ b/branch-4.0/install/start_all.html @@ -0,0 +1,757 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    The start-all.sh Command

                    +

                    Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                    +

                    The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                    +
                    +

                    General Options

                    +

                    -h Help, Print the help, and exit.

                    +

                    –version print the current Scylla-Monitoring stack version, and exit.

                    +

                    -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                    +

                    -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                    +

                    -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                    +

                    –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                    +
                    + + +
                    +

                    Alert Manager

                    +

                    The Alertmanager handles the alerts and takes the following parameters:

                    +

                    -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                    +

                    -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                    +

                    -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/thanos.html b/branch-4.0/install/thanos.html new file mode 100644 index 000000000..5ea923408 --- /dev/null +++ b/branch-4.0/install/thanos.html @@ -0,0 +1,760 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Using Thanos as Data Source With Scylla Monitoring Stack

                    +

                    Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                    +
                      +
                    • High-availability.

                    • +
                    • Horizontal scaling.

                    • +
                    • Backup.

                    • +
                    +

                    The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                    +

                    The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                    +
                    +

                    Using Thanos As a Prometheus Aggregator

                    +

                    There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                    +
                    +

                    Prometheus Configuration

                    +

                    We will assume you have two Prometheus servers running.

                    +
                      +
                    1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                    2. +
                    3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                    4. +
                    +
                    +
                    +

                    Thanos sidecar

                    +

                    The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                    +
                    docker run -d \
                    + -v /path/to/prom/dir:/data/prom:z \
                    + -i --name sidecar thanosio/thanos \
                    + sidecar \
                    + --grpc-address=0.0.0.0:10911 \
                    + --grpc-grace-period=1s \
                    + --http-address=0.0.0.0:10912 \
                    + --http-grace-period=1s \
                    + --prometheus.url=http://prometheus-ip:9090 \
                    + --tsdb.path=/data/prom \
                    + -p 10912:10912 \
                    + -p 10911:10911
                    +
                    +
                    +

                    After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                    +
                    +
                    +

                    Thanos query

                    +

                    Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                    +
                    docker run -d \
                    + --name thanos -- thanosio/thanos \
                    +   query \
                    +   --debug.name=query0 \
                    +   --log.level=debug \
                    +   --grpc-address=0.0.0.0:10903 \
                    +   --grpc-grace-period=1s \
                    +   --http-address=0.0.0.0:10904 \
                    +   --http-grace-period=1s \
                    +   --query.replica-label=prometheus \
                    +   --store={ip1}:10911 --store={ip2}:10911
                    +
                    +
                    +

                    After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                    +
                    +
                    +

                    Update Scylla Data source

                    +

                    The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                    +

                    The file you edit is a template file that replaces the file Grafana uses, next time you start.

                    +

                    Restart the Scylla Monitoring Stack it should now use Thanos.

                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/intro.html b/branch-4.0/intro.html new file mode 100644 index 000000000..94657f41e --- /dev/null +++ b/branch-4.0/intro.html @@ -0,0 +1,710 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack

                    +

                    Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                    +_images/monitor.png +

                    The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers:

                    +
                      +
                    • prometheus - Collects and stores metrics

                    • +
                    • grafan-loki - Parses logs and generates metrics and alerts

                    • +
                    • alertmanager - Handles alerts

                    • +
                    • grafana - Dashboards server

                    • +
                    +

                    A few optional components are used for additional services

                    +
                      +
                    • grafana-image-renderer - Allows you to download a dashboard as an image.

                    • +
                    • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                    • +
                    +
                    +

                    High Level Architecture

                    +_images/monitoring_stack1.png +

                    We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the node_exporter agent that runs on the Scylla server.

                    +

                    We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers.

                    +

                    The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                    +

                    We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL.

                    +

                    Choose a topic to get started:

                    + +

                    For older versions of Scylla Monitoring Stack Documentation see here.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/objects.inv b/branch-4.0/objects.inv new file mode 100644 index 000000000..47fdee1e0 Binary files /dev/null and b/branch-4.0/objects.inv differ diff --git a/branch-4.0/procedures/alerts/alerting.html b/branch-4.0/procedures/alerts/alerting.html new file mode 100644 index 000000000..10d464be8 --- /dev/null +++ b/branch-4.0/procedures/alerts/alerting.html @@ -0,0 +1,756 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Alerting

                    +

                    Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                    +

                    You can read more about Prometheus alerting here

                    +

                    By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                    +

                    In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                    +

                    The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                    +../../_images/monitoring_stack.png +
                    +

                    Prometheus Alerts

                    +

                    The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                    +

                    Each alert consists of:

                    +
                      +
                    • Name

                    • +
                    • What happened

                    • +
                    • For how long

                    • +
                    • What to report

                    • +
                    +

                    For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                    +
                    - alert: InstanceDown
                    +  expr: up == 0
                    +  for: 60s
                    +  labels:
                    +    severity: "2"
                    +  annotations:
                    +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                    +    summary: Instance {{ $labels.instance }} down
                    +
                    +
                    +

                    The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                    +

                    The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                    +

                    The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                    +

                    annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                    +
                    +
                    +

                    Alertmanager

                    +

                    The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                    +

                    The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                    +
                      +
                    • Routes: Represent a routing tree, the most specific rule, wins

                    • +
                    • Inhibition: Mute an alert, based on another alert

                    • +
                    • Receiver: Send a notification via email, sluck, etc’

                    • +
                    +

                    Check the Alertmanager documentation for details on how to specify a specific receiver.

                    +

                    In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                    +
                    +
                    +

                    Tips When Adding an Alert

                    +

                    It’s worse having an alert that does not work, than not having an alert at all

                    +

                    There are multiple ways you can use to make sure your alert is set correctly:

                    +
                      +
                    • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                    • +
                    • Force the alert to be active by reducing the limits or the duration.

                    • +
                    • When possible simulate the actual scenario and see that the alert works as expected.

                    • +
                    +

                    For example, low available disk space.

                    +

                    Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                    +

                    Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                    +

                    Starting with a simple working expression helps you bisect problems.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/procedures/alerts/index.html b/branch-4.0/procedures/alerts/index.html new file mode 100644 index 000000000..717359995 --- /dev/null +++ b/branch-4.0/procedures/alerts/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Alert Manager

                    +
                    +
                    +

                    Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/procedures/index.html b/branch-4.0/procedures/index.html new file mode 100644 index 000000000..cf91cdfbd --- /dev/null +++ b/branch-4.0/procedures/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Procedures

                    +
                    +
                    +

                    There are several reference guides available which give additional information. Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/procedures/updating_dashboard.html b/branch-4.0/procedures/updating_dashboard.html new file mode 100644 index 000000000..c1007bce6 --- /dev/null +++ b/branch-4.0/procedures/updating_dashboard.html @@ -0,0 +1,965 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Adding and Modifying Dashboards

                    +

                    This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                    +

                    It covers dashboard templates and how to modify them.

                    + +
                    +

                    General Limitations

                    +

                    Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                    +
                    +

                    Consistency Between Restarts

                    +

                    By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                    +
                    +
                    +

                    Consistency Between Upgrades

                    +

                    As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                    +
                    +

                    Note

                    +

                     You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                    +
                    +

                    At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                    +
                    +
                    +
                    +

                    Using Templated Dashboards

                    +

                    Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                    +

                    Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                    +

                    For example a typical graph panel would look like this:

                    +
                    {
                    +    "aliasColors": {},
                    +    "bars": false,
                    +    "datasource": "prometheus",
                    +    "editable": true,
                    +    "error": false,
                    +    "fill": 0,
                    +    "grid": {
                    +        "threshold1": null,
                    +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                    +        "threshold2": null,
                    +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                    +    },
                    +    "gridPos": {
                    +        "h": 6,
                    +        "w": 10,
                    +        "x": 0,
                    +        "y": 4
                    +    },
                    +    "id": 2,
                    +    "isNew": true,
                    +    "legend": {
                    +        "avg": false,
                    +        "current": false,
                    +        "max": false,
                    +        "min": false,
                    +        "show": false,
                    +        "total": false,
                    +        "values": false
                    +    },
                    +    "lines": true,
                    +    "linewidth": 2,
                    +    "links": [],
                    +    "nullPointMode": "connected",
                    +    "percentage": false,
                    +    "pointradius": 5,
                    +    "points": false,
                    +    "renderer": "flot",
                    +    "seriesOverrides": [
                    +        {}
                    +    ],
                    +    "span": 5,
                    +    "stack": false,
                    +    "steppedLine": false,
                    +    "targets": [
                    +        {
                    +            "expr": "sum(node_filesystem_avail) by (instance)",
                    +            "intervalFactor": 1,
                    +            "legendFormat": "",
                    +            "refId": "A",
                    +            "step": 1
                    +        }
                    +    ],
                    +    "timeFrom": null,
                    +    "timeShift": null,
                    +    "title": "Available Disk Size",
                    +    "tooltip": {
                    +        "msResolution": false,
                    +        "shared": true,
                    +        "sort": 0,
                    +        "value_type": "cumulative"
                    +    },
                    +    "transparent": false,
                    +    "type": "graph",
                    +    "xaxis": {
                    +        "show": true
                    +    },
                    +    "yaxes": [
                    +        {
                    +            "format": "percent",
                    +            "logBase": 1,
                    +            "max": 101,
                    +            "min": 0,
                    +            "show": true
                    +        },
                    +        {
                    +            "format": "short",
                    +            "logBase": 1,
                    +            "max": null,
                    +            "min": null,
                    +            "show": true
                    +        }
                    +    ]
                    +}
                    +
                    +
                    +

                    As you can imagine, most panels would have similar values.

                    +

                    To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                    +
                    +

                    The Template Class System

                    +

                    The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                    +

                    The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                    +

                    In the template file, you can also add or override attributes.

                    +

                    The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                    +

                    When generating dashboards, each class will be replaced by its definition.

                    +

                    For example, a row in the type.json is defined as:

                    +
                    {
                    + "base_row": {
                    +     "collapse": false,
                    +     "editable": true
                    + },
                    + "row": {
                    +     "class": "base_row",
                    +     "height": "250px"
                    + }
                    + }
                    +
                    +
                    +

                    Will be used like in a template:

                    +
                    {
                    +     "class": "row",
                    +     "height": "150px",
                    +     "panels": [
                    +     ]
                    +}
                    +
                    +
                    +

                    And the output will be:

                    +
                    {
                    +     "class": "row",
                    +     "collapse": false,
                    +     "editable": true,
                    +     "height": "150px",
                    +     "panels": [
                    +
                    +     ]
                    +}
                    +
                    +
                    +

                    We can see that the template added the panels attribute and that it overrides the height attribute.

                    +
                    +
                    +

                    Panel Example

                    +

                    Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                    +
                    {
                    +     "class": "row",
                    +     "panels": [
                    +         {
                    +             "class": "bytes_panel",
                    +             "span": 3,
                    +             "targets": [
                    +                 {
                    +                     "expr": "sum(node_filesystem_avail) by (instance)",
                    +                     "intervalFactor": 1,
                    +                     "legendFormat": "",
                    +                     "metric": "",
                    +                     "refId": "A",
                    +                     "step": 1
                    +                 }
                    +             ],
                    +             "title": "Available Disk Size"
                    +         }
                    +     ]
                    +}
                    +
                    +
                    +

                    In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                    +

                    You can also see that the span attribute is overridden to set the panel size.

                    +

                    To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                    +
                    +
                    +

                    Grafana Formats and Layouts

                    +

                    The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                    +

                    Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                    +

                    The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                    +

                    To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                    +

                    The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                    +

                    You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                    +

                    gridPos has the following attributes:

                    +
                    {
                    +   "x": 0,
                    +   "y": 0,
                    +   "w": 24,
                    +   "h": 4
                    + }
                    +
                    +
                    +

                    When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                    +
                    {
                    +   "gridPos": {
                    +      "h": 2
                    +    }
                    +}
                    +
                    +
                    +
                    +
                    +

                    Generating the dashboards from templates (generate-dashboards.sh)

                    +
                    +

                    Prerequisite

                    +

                    Python 2.7

                    +

                    make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                    +

                    Use the -h flag to get help information.

                    +

                    You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                    +

                    When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                    +

                    For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                    +

                    .\generate-dashboards.sh -v 2020.1

                    +
                    +

                    Note

                    +

                    generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                    +
                    +
                    +
                    +
                    +

                    Validation

                    +

                    After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                    +

                    Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/reference/index.html b/branch-4.0/reference/index.html new file mode 100644 index 000000000..c58dd2830 --- /dev/null +++ b/branch-4.0/reference/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Reference Guide

                    +
                    +
                    +

                    There are several reference guides available which give additional information. Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/reference/matrix.html b/branch-4.0/reference/matrix.html new file mode 100644 index 000000000..d0f907a1b --- /dev/null +++ b/branch-4.0/reference/matrix.html @@ -0,0 +1,819 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Support Matrix

                    +

                    The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                    Scylla Monitoring Stack Version

                    Scylla Open Source Version

                    Scylla Enterprise Version

                    Node_exporter[1] Version

                    Scylla Manager Version

                    4.0

                    4.3, 4.4, 4.5, 4.6, 5.0

                    2020.1, 2021.1, 2022.2

                    0.17

                    2.3, 2.4, 2.5, 2.6, 3.0

                    3.11

                    4.3, 4.4, 4.5, 4.6, 5.0

                    2020.1, 2021.1, 2022.2

                    0.17

                    2.3, 2.4, 2.5, 2.6

                    3.10

                    4.3, 4.4, 4.5, 4.6

                    2020.1, 2021.1

                    0.17

                    2.3, 2.4, 2.5, 2.6

                    3.9

                    4.3, 4.4, 4.5, 4.6

                    2020.1, 2021.1

                    0.17

                    2.3, 2.4, 2.5

                    3.8

                    4.3, 4.4, 4.5

                    2020.1, 2021.1

                    0.17

                    2.3, 2.4, 2.5

                    3.7

                    4.2, 4.3, 4.4

                    2019.1, 2020.1, 2021.1

                    0.17

                    2.2, 2.3

                    3.6.3

                    4.2, 4.3, 4.4

                    2019.1, 2020.1, 2021.1

                    0.17

                    2.2, 2.3, 2.1

                    3.6

                    4.1, 4.2, 4.3

                    2019.1, 2020.1

                    0.17

                    2.1, 2.2, 2.3

                    3.6.1

                    4.1, 4.2, 4.3

                    2019.1, 2020.1

                    0.17

                    2.1, 2.2

                    3.6.1

                    4.1, 4.2, 4.3, 4.4

                    2019.1, 2020.1

                    0.17

                    2.1, 2.2

                    3.5

                    3.3, 4.0, 4.1, 4.2

                    2019.1, 2020.1

                    0.17

                    2.0, 2.1, 2.2

                    3.4.3

                    3.3, 4.0, 4.1, 4.2

                    2019.1, 2020.1

                    0.17

                    2.0, 2.1

                    3.4

                    3.3, 4.0, 4.1

                    2018.1, 2019.1

                    0.17

                    2.0, 2.1

                    3.3

                    3.1, 3.2, 3.3, 4.0

                    2018.1, 2019.1

                    0.17

                    1.4, 2.0, 2.1

                    3.2

                    3.1, 3.2, 3.3

                    2018.1, 2019.1

                    0.17

                    1.4, 2.0

                    3.1

                    2.3, 3.0, 3.1, 3.2

                    2018.1, 2019.1

                    0.17

                    1.3, 1.4, 2.0

                    3.0

                    2.3, 3.0, 3.1, 3.2

                    2018.1, 2019.1

                    0.17

                    1.3, 1.4

                    2.4

                    2.3, 3.0, 3.1

                    2018.1, 2019.1

                    0.14, 0.17

                    1.3, 1.4

                    2.3

                    2.3, 3.0

                    2018.1, 2019.1

                    0.14, 0.17

                    1.3

                    2.2

                    2.3, 3.0

                    2018.1, 2019.1

                    0.14, 0.17

                    1.3

                    2.1

                    2.3, 3.0

                    2018.1

                    0.14, 0.17

                    1.3

                    +

                    [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/reference/monitoring_apis.html b/branch-4.0/reference/monitoring_apis.html new file mode 100644 index 000000000..436e89240 --- /dev/null +++ b/branch-4.0/reference/monitoring_apis.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Interfaces

                    +

                    Scylla exposes two interfaces for online monitoring, as described below

                    +
                    +

                    Prometheus

                    +

                    By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                    +

                    For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                    +

                    You can change the Prometheus listening address and port in scylla.yaml file

                    +
                    # prometheus port
                    +# By default, Scylla opens prometheus API port on port 9180
                    +# setting the port to 0 will disable the prometheus API.
                    +prometheus_port: 9180
                    +#
                    +# prometheus address
                    +# By default, Scylla binds all interfaces to the prometheus API
                    +# It is possible to restrict the listening address to a specific one
                    +prometheus_address: 0.0.0.0
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/robots.txt b/branch-4.0/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.0/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.0/search.html b/branch-4.0/search.html new file mode 100644 index 000000000..7df4f5886 --- /dev/null +++ b/branch-4.0/search.html @@ -0,0 +1,652 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + + + +
                    + + + + + +
                    + + +
                    + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/searchindex.js b/branch-4.0/searchindex.js new file mode 100644 index 000000000..4700c2f70 --- /dev/null +++ b/branch-4.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "Scylla Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Scylla Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], "scylla": [0, 2, 4, 7, 10, 13, 25, 26, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40], "monitor": [0, 2, 4, 7, 10, 13, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40], "stack": [0, 2, 4, 7, 10, 13, 21, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 18, 20, 22, 25, 26, 27, 28, 31, 32, 33, 34, 36, 38, 39, 40], "full": [0, 1, 3, 6, 9, 10, 25], "alert": [0, 1, 3, 5, 6, 9, 12], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 15, 18, 20, 22, 34, 36, 38], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 13, 20, 28, 32, 38, 40], "open": [0, 1, 3, 5, 6, 9, 15, 16, 19, 24], "sourc": [0, 1, 3, 5, 6, 9, 10, 15, 19, 20, 38], "tool": [0, 1, 3, 9, 18, 40], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 13, 15, 18, 21, 22, 23, 24, 40], "grafana": [0, 1, 3, 8, 9, 10, 21, 23, 24], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 12, 15, 18, 21, 22, 23, 24, 33, 40, 41], "consist": [1, 9, 10, 20, 33], "three": [1, 6, 10, 24], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 18, 20, 24], "collect": [1, 5, 6, 7, 8, 9, 22, 24, 34, 36], "store": [1, 5, 8, 9, 13, 21, 23, 24, 26, 27, 38], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 13, 15, 20, 21, 22, 23, 40], "alertmanag": [1, 2, 7, 9, 21, 23, 24], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 16, 20, 25, 40], "choos": [1, 3, 9, 11, 12, 14, 17, 18, 41], "topic": [1, 3, 9, 11, 12, 14, 17, 41], "get": [1, 6, 8, 9, 10, 13, 24, 26, 33, 37, 38, 39, 40], "start": [1, 3, 5, 8, 9, 10, 13, 20, 21, 22, 23, 32], "user": [1, 2, 6, 7, 9, 25, 40], "guid": [1, 6, 9, 12, 18, 19], "download": [1, 5, 6, 9, 20, 21, 22, 23, 24], "instal": [1, 2, 9, 18], "procedur": [1, 5, 6, 9, 18, 19], "troubleshoot": [1, 9, 31], "refer": [1, 6, 9, 12], "upgrad": [1, 12], "lesson": [1, 9, 27, 28], "univers": [1, 9], "github": [1, 5, 6, 21, 23, 24], "project": 1, "For": [1, 2, 4, 5, 6, 7, 9, 10, 13, 16, 18, 20, 24, 33, 34, 37, 40], "older": [1, 9, 22, 23, 24], "version": [1, 2, 5, 7, 9, 13, 15, 18], "document": [1, 5, 6, 8, 9, 10, 13, 18, 20, 21, 22, 23, 24], "see": [1, 2, 4, 5, 6, 9, 10, 13, 16, 18, 20, 21, 22, 23, 24, 32, 40], "here": [1, 5, 6, 7, 9, 10, 20], "base": [2, 5, 6, 7, 8, 9, 10, 13, 24, 25, 40], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 20, 21, 22, 23, 24, 28, 30, 32, 33, 39, 40, 41], "can": [2, 5, 6, 7, 8, 10, 13, 16, 18, 20, 21, 22, 23, 24, 25, 28, 32, 33, 40, 41], "all": [2, 3, 5, 6, 8, 10, 13, 16, 18, 20, 22, 25, 29, 33, 40], "sh": [2, 3, 6, 18, 20, 21, 22, 23, 24], "kill": [2, 6, 18, 20, 22], "script": [2, 3, 6, 7, 13, 22], "an": [2, 4, 5, 7, 8, 9, 13, 18, 20, 22, 24, 30, 31, 33, 34, 36, 38, 40], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 13, 16, 20, 24], "requir": [2, 8, 26, 29, 34, 40], "more": [2, 4, 5, 6, 10, 13, 16, 18, 25, 28, 31, 32, 34, 37, 40], "manual": [2, 18], "step": [2, 5, 8, 13, 18, 20, 21, 22, 23, 24], "onc": [2, 20, 24, 30, 38, 40], "configur": [2, 7, 10, 13, 16, 18, 20, 32, 33], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 20, 21, 22, 23, 24, 32, 33, 34, 35, 38, 39, 40, 41], "two": [2, 6, 7, 8, 13, 16, 20, 23, 24, 33, 38, 40], "wai": [2, 5, 7, 10, 18, 24, 31, 40], "launch": 2, "should": [2, 4, 5, 6, 8, 13, 18, 20, 22, 23, 24, 25, 26, 29, 30, 31, 37, 40], "one": [2, 6, 7, 16, 20, 21, 22, 23, 24, 26, 28, 29, 32, 33, 34, 40], "both": [2, 5, 6, 18, 21, 23, 24, 40], "In": [2, 6, 10, 13, 18, 20, 24, 32, 40], "particular": 2, "creat": [2, 5, 6, 7, 10, 13, 18, 25, 38, 40], "updat": [2, 5, 13, 18, 20], "yml": [2, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 24, 32, 40], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 13, 18, 20, 21, 23, 24, 27, 32, 33, 34, 39, 40], "make": [2, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 24, 33, 40], "sure": [2, 5, 6, 8, 10, 13, 18, 20, 21, 22, 23, 24, 40], "have": [2, 4, 5, 6, 7, 8, 10, 13, 18, 23, 24], "among": [2, 33], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 16, 18, 20, 21, 23, 24], "address": [2, 5, 6, 7, 8, 16, 18, 20], "either": [2, 6], "locat": [2, 7, 10, 20, 22, 33], "scylla_serv": [2, 5, 6, 18, 20, 21, 22, 23, 24, 40], "consul": [2, 7], "manag": [2, 5, 12, 15, 17], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 40], "exampl": [2, 4, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 24, 33, 34, 40], "product": [2, 7], "system": [2, 7, 9, 10, 11, 21, 23, 24, 26, 32, 33, 40], "advis": [2, 33], "extern": [2, 5, 7, 8, 10, 13, 18, 21, 23, 24, 40], "directori": [2, 5, 7, 8, 10, 13, 20, 21, 22, 23, 24], "databas": [2, 5, 7, 20, 28, 40], "accordingli": 2, "below": [2, 5, 6, 10, 13, 16], "read": [2, 5, 6, 8, 9, 10, 18, 20, 25, 29, 32], "its": [2, 5, 6, 7, 8, 9, 13, 20], "from": [2, 5, 7, 8, 9, 10, 18, 20, 21, 22, 23, 24, 25, 31, 35, 40], "note": [2, 5, 6, 7, 18, 20, 21, 23, 24], "latter": 2, "tell": 2, "where": [2, 5, 6, 13, 18, 20, 24, 40], "themselv": [2, 13], "which": [2, 8, 12, 13, 14, 15, 31, 32, 34, 36, 38, 40], "differ": [2, 5, 6, 7, 8, 13, 20, 21, 22, 23, 24, 30, 31, 40], "run": [2, 3, 5, 6, 7, 8, 9, 13, 15, 18, 20, 22, 32, 39], "follow": [2, 4, 5, 6, 7, 13, 15, 18, 20, 21, 23, 24, 32, 40], "command": [2, 6, 8, 18, 20, 21, 23, 24, 32], "datasourc": [2, 5, 6, 8, 13], "under": [2, 5, 6, 24], "yaml": [2, 5, 6, 16], "To": [2, 4, 5, 6, 13, 16, 20, 21, 22, 23, 24], "sashboard": 2, "t": [2, 13, 24], "line": [2, 5, 6, 7, 8, 13, 20, 24, 32], "flag": [2, 6, 7, 8, 13, 18, 20, 21, 23, 24], "v": [2, 6, 7, 8, 13, 18], "specifi": [2, 6, 7, 10, 13, 18, 20, 32], "enterpris": [2, 6, 13, 15], "2020": [2, 6, 13, 15], "1": [2, 5, 6, 7, 8, 13, 15, 19, 21, 23, 24], "thi": [2, 4, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 24, 25, 26, 29, 32, 33, 35, 39, 40], "your": [2, 5, 6, 7, 8, 10, 11, 13, 16, 18, 20, 21, 23, 24, 26, 27, 28, 40], "pass": [2, 6, 7, 20], "call": [2, 6, 7], "servic": [2, 5, 6, 7, 9, 18], "container_nam": 2, "aalert": 2, "imag": [2, 9, 18], "prom": [2, 8, 18], "v0": [2, 5], "21": 2, "port": [2, 5, 6, 7, 16, 18, 20, 21, 23, 24], "9093": [2, 5], "volum": [2, 4, 5, 6, 21, 23, 24], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 13, 24], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 13, 22, 32], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "scylladb": [2, 5, 6, 21, 23, 24, 28, 29, 31, 32, 34, 36, 37], "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 13], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 13, 15], "3": [2, 4, 5, 6, 13, 15, 19, 34], "5": [2, 5, 6, 13, 15, 18], "3000": [2, 5, 6, 21, 23, 24], "1000": [2, 32], "build": [2, 5], "plugin": 2, "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 13, 27, 34, 36, 40], "path": [2, 5, 6, 7, 8, 10, 20, 21, 22, 23, 24], "dir": [2, 7, 8, 21, 23, 24], "loki": [2, 6, 9], "mnt": 2, "3100": [2, 5], "rule": [2, 5, 7, 10, 24, 30, 39], "conf": [2, 5, 6], "aprom": [2, 18, 24], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 18, 24], "d": [2, 5, 6, 7, 8, 20, 21, 22, 23, 24], "scylla_manager_serv": [2, 5, 6, 18, 20, 22, 23, 24], "node_exporter_serv": [2, 5, 6, 20, 21], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 18, 20, 24, 40], "down": [2, 10, 18, 20, 21, 23, 24, 26, 32, 34], "begin": [3, 11, 12, 14, 17, 41], "deploi": [3, 6], "without": [3, 6, 7, 13, 20, 24], "us": [3, 4, 7, 9, 10, 11, 18, 20, 21, 22, 23, 24, 28, 33, 34, 36, 38, 40], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 39], "least": [4, 5, 6, 24], "physic": [4, 5, 6], "core": [4, 5, 6, 24], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 21, 23, 24, 32, 34, 38], "storag": [4, 5, 6, 7, 9, 13, 24], "retent": [4, 5, 6, 20, 24], "period": [4, 5, 6, 8, 10, 20, 32, 38], "section": [4, 5, 6, 18, 20, 23, 24, 40], "network": [4, 5, 6, 7, 18], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 18], "perform": [4, 5, 6, 24, 32, 33, 37, 40], "block": [4, 5, 6, 24], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 24, 28, 34, 36, 40], "default": [4, 5, 6, 7, 10, 13, 16, 18, 20, 22, 24, 29, 40], "15": [4, 5, 6, 20, 24], "dai": [4, 5, 6, 7, 20, 24], "around": [4, 5, 6, 18], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 40], "assum": [4, 5, 6, 7, 8, 10, 21, 23, 24], "scrape": [4, 5, 6], "interv": [4, 5, 6], "20": [4, 5, 6, 37], "6": [4, 5, 6, 13, 15], "node": [4, 5, 7, 15, 18, 20, 26, 27, 28, 33, 34, 36, 37, 40], "cluster": [4, 5, 6, 24, 31, 40], "each": [4, 5, 7, 8, 9, 10, 13, 15, 18, 26, 28, 33, 38, 40], "16": [4, 5, 6, 18], "so": [4, 5, 6, 7, 8, 10, 13, 18, 20, 24, 28, 40], "total": [4, 5, 6, 8, 13, 24], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 20, 22, 30, 38, 40], "need": [4, 5, 6, 7, 8, 13, 18, 24, 26, 27, 28, 39, 40], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 13, 18, 35, 39, 40], "replac": [4, 5, 6, 8, 13, 21, 23, 24], "ad": [4, 5, 6, 7, 12], "we": [4, 5, 6, 8, 9, 13, 21, 23, 24, 40], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 13, 18, 20, 24, 26, 32, 40], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 13, 18, 38, 40], "fast": [4, 5, 6, 39], "enough": [4, 5, 6, 39], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 13, 18, 20, 24, 26, 33, 40], "out": [4, 5, 6, 8, 39], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 33, 34, 36], "over": [4, 5, 6, 24], "longer": [4, 5, 6, 13, 20, 22, 24], "durat": [4, 5, 6, 10, 24], "e": [4, 5, 6, 13, 24], "g": [4, 5, 6, 7, 20, 21, 23, 24], "look": [4, 5, 6, 8, 10, 13, 24, 40], "week": [4, 5, 6, 7, 24], "view": [4, 5], "would": [4, 5, 6, 8, 10, 13, 20, 24, 25, 28, 40], "take": [4, 5, 6, 7, 13, 18, 20, 24], "than": [4, 5, 6, 10, 13, 20, 24, 40], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 24, 33], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 18, 22, 34], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 13, 16, 20, 40], "swap": [4, 5, 6], "crash": [4, 5, 6], "instruct": [5, 6, 21, 23, 24], "help": [5, 7, 10, 13, 40], "pleas": [5, 18], "most": [5, 10, 13, 24, 33, 35, 40], "current": [5, 6, 7, 10, 13, 18, 21, 23, 24], "common": [5, 7, 40], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 18], "standalon": 5, "thei": [5, 7, 10, 13, 37, 38], "alreadi": [5, 21, 23, 24], "consolid": 5, "componen": 5, "suggest": [5, 13, 24], "those": [5, 24], "offici": 5, "also": [5, 6, 7, 8, 10, 13], "main": [5, 20, 38], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 26, 40], "data": [5, 7, 9, 10, 13, 20, 21, 22, 23, 25, 26, 27, 28, 33, 34, 36, 37, 39, 40], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 18], "befor": [5, 6, 10, 20, 21, 22, 23, 24, 26, 27, 34, 40], "support": [5, 6, 13, 14, 25, 31, 40], "want": [5, 6, 10, 21, 23, 24], "latest": [5, 6, 7, 21, 23, 24], "releas": [5, 20, 21, 22, 23, 24], "tightli": 5, "compat": [5, 13, 18, 20, 22], "matrix": [5, 14], "cento": [5, 18], "instanc": [5, 6, 10, 13, 24], "wget": [5, 6, 21, 23, 24], "http": [5, 6, 8, 18, 20, 21, 23, 24, 28, 29, 31, 37], "com": [5, 6, 21, 23, 24, 28, 29, 31, 37], "archiv": [5, 6, 21, 23, 24], "ref": 5, "tag": 5, "tar": [5, 6, 21, 23, 24], "gz": [5, 6], "xvf": [5, 6], "test": [5, 18, 21, 40], "22": [5, 13], "linux": 5, "amd64": 5, "copi": [5, 20, 21, 22, 23], "file": [5, 7, 8, 10, 13, 16, 20, 22, 32], "cp": [5, 21, 22, 23, 24], "p": [5, 7, 8, 18, 20, 21, 23, 24], "home": 5, "cd": [5, 6, 21, 23, 24], "verifi": [5, 22], "point": [5, 6, 13, 21, 23, 24], "browser": [5, 6, 8, 13, 18, 21, 23, 24], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 18, 24], "aggreg": 5, "inspir": 5, "central": [5, 9], "check": [5, 10, 18, 21, 23, 24, 35, 36, 40], "recomand": 5, "local": [5, 6, 7, 8, 9, 13, 18, 21, 23, 24, 40], "describ": [5, 6, 8, 16, 18, 40], "respons": [5, 10], "pars": [5, 9, 13, 30, 40], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 34, 36], "load": [5, 6, 18, 24, 25, 28, 29, 40], "multipl": [5, 6, 7, 8, 9, 10, 13, 26, 29, 30, 37, 39, 40], "do": [5, 6, 7, 13, 18, 20, 21, 22, 23, 24, 28, 32, 40], "rsyslog": [5, 9], "second": [5, 6, 10, 18, 20, 21, 23], "relat": [5, 40], "modifi": [5, 12], "mkdir": 5, "templat": [5, 6, 8, 18, 20, 40], "edit": [5, 6, 7, 8, 13, 18], "localhost": [5, 7, 24], "loki_ip": 5, "": [5, 6, 7, 9, 10, 13, 25, 26, 35, 38, 40], "27": [5, 6, 13], "If": [5, 6, 7, 8, 13, 18, 20, 22, 24, 32, 35, 37, 38, 39, 40], "besid": [5, 7, 20, 40], "expect": [5, 10, 21, 23, 24], "scrap": 5, "job": [5, 6, 18], "onli": [5, 6, 7, 20, 22, 24, 28, 30, 32, 38, 40], "import": [5, 6, 7, 20, 21, 23, 24, 32], "record": [5, 24], "asspect": 5, "work": [5, 6, 7, 8, 10, 13, 20, 21, 23, 24], "code": [5, 33], "shell": 5, "prom_rul": [5, 24], "correct": [5, 22], "static": [5, 32], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 20, 31], "host": [5, 6, 7, 9, 18], "static_config": [5, 6], "target": [5, 7, 13, 16, 18, 20, 22], "127": [5, 7, 18], "right": [5, 6, 13, 33, 40], "typic": [5, 13, 24, 26, 28, 38, 40], "node_export": [5, 6, 7, 9, 15, 18], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 13, 16, 20, 22, 29, 40], "everi": [5, 6, 7, 24], "scrape_timeout": 5, "timeout": [5, 39], "try": [5, 18], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 24], "ani": [5, 6, 10, 13, 18, 33, 40], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 20], "scrape_config": [5, 20], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 16, 18], "There": [5, 6, 8, 10, 12, 13, 14, 24, 37, 39, 41], "instead": [5, 6, 8, 24, 40], "found": [5, 6, 7, 10, 13], "must": [5, 6, 34], "even": [5, 6, 7], "center": [5, 6, 8, 40], "cat": 5, "list": [5, 6], "end": [5, 6, 20, 40], "66": [5, 18], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 24], "dc1": [5, 6], "172": [5, 6, 18], "17": [5, 6, 15, 18, 22], "dc2": [5, 6], "previou": [5, 23, 24], "deprec": 5, "5090": [5, 6, 18], "tsdb": [5, 7, 8, 24], "accumul": 5, "consol": [5, 18], "visibl": 5, "execut": [5, 25, 30], "through": 5, "node_memory_memfre": 5, "And": [5, 13, 21, 23], "scylla_reactor_util": 5, "At": [5, 13, 23, 24], "emit": 5, "abl": [5, 8, 20, 22, 24], "them": [5, 7, 9, 10, 13, 22, 33], "grafna": 5, "depend": [5, 8, 24], "repositori": [5, 6], "yum": 5, "zip": [5, 21, 23, 24], "structur": 5, "rest": [5, 8, 24], "access": [5, 7], "sudo": [5, 6, 18], "r": [5, 7, 13, 18], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 13, 18], "provis": [5, 6, 13], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 13, 26, 27, 34, 38, 40], "folder": 5, "name": [5, 6, 8, 10, 18, 22, 40], "otherwis": 5, "some": [5, 8, 10, 24, 33, 37], "tabl": [5, 6, 10, 15, 25, 33, 40], "apivers": 5, "type": [5, 13, 40], "url": [5, 8, 20, 24], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 33, 41], "connect": [5, 8, 13, 16, 18], "between": [5, 8, 18, 20, 21, 23, 24, 32, 33, 40], "give": [5, 12, 14], "strongli": 5, "encourag": 5, "restrict": [5, 16], "keyspac": [5, 6], "part": [5, 6, 10, 22, 25, 28, 33, 40], "option": [5, 6, 8, 9, 18, 20, 24, 32], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 13, 20], "detail": [5, 10, 32, 33], "done": [5, 6, 7, 13, 18, 24], "first": [5, 21, 23, 24, 40], "new": [5, 6, 18, 38], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 40], "AND": 5, "login": [5, 6, 18], "proper": [5, 18], "select": [5, 33, 40], "permiss": [5, 6, 20], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 13, 30, 32], "mention": [5, 13], "previous": [5, 23, 24], "safer": [5, 40], "dedic": [5, 6], "limit": [5, 6, 8, 10, 29, 32, 40], "privileg": [5, 7, 24], "un": [5, 24], "comment": 5, "relev": [5, 7, 24, 33], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 18], "evalu": [6, 24], "laptop": 6, "34": 6, "8": [6, 15, 20, 24], "11": [6, 15], "32": 6, "10": [6, 10, 13, 15], "9": [6, 15, 24], "29": 6, "25": [6, 18], "avoid": [6, 13, 18, 29, 31, 40], "root": [6, 18, 21, 23, 24], "go": [6, 18], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 21, 23, 24], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 18, 20], "extract": 6, "binari": [6, 18], "clone": 6, "git": 6, "directli": [6, 9], "checkout": 6, "restart": [6, 7, 8, 20], "know": [6, 18, 28, 40], "higher": [6, 24, 28, 40], "wish": [6, 7], "match": [6, 40], "datacent": 6, "nodetool": 6, "statu": [6, 18, 24], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 20], "listen": [6, 7, 16, 20], "set": [6, 7, 10, 13, 16, 32], "inform": [6, 7, 12, 13, 14, 16, 24, 25, 26, 27], "agent": [6, 7, 8, 9, 15, 18], "machin": [6, 7, 18, 22], "overrid": [6, 7, 13], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 13], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 18, 21, 23, 24], "within": [6, 10, 13], "protect": 6, "assign": 6, "place": [6, 7, 8, 13, 40], "outsid": [6, 7, 20], "result": [6, 7, 20, 26, 28, 29, 32, 38, 40], "lost": [6, 7, 13, 40], "exist": [6, 13, 40], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 32, 40], "firewal": [6, 18], "7000": [6, 18], "myservic": 6, "m": [6, 7, 20, 21, 23, 24], "2019": [6, 15, 37], "reach": [6, 8, 28, 32, 34, 40], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 28, 29, 34, 36, 40], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 13, 18], "authent": [6, 7], "disabl": [6, 16], "simplest": 7, "small": [7, 38], "util": [7, 13, 22, 24], "appropri": 7, "h": [7, 13], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 24, 34, 39], "map": 7, "bind": [7, 16], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 20, 24, 27, 30, 33], "addit": [7, 8, 9, 10, 12, 14, 24, 40], "specif": [7, 10, 16, 18, 35, 40], "driver": [7, 28, 29, 37, 40], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 18, 39], "gui": [7, 13, 18], "keep": [7, 20, 24], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 13, 24], "mean": [7, 13, 20, 25, 26, 27, 28, 29, 34, 36, 40], "chang": [7, 13, 16, 18, 20, 21, 22, 23, 24], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 13], "b": [7, 24], "o": [7, 15, 22, 33], "disk": [7, 10, 13, 18, 25, 27, 33], "possibl": [7, 10, 16, 31, 40], "api": [7, 8, 16, 20], "resolv": 7, "explicitli": [7, 13], "request": [7, 16, 33, 39], "how": [7, 8, 10, 13, 21, 23, 24, 26, 27, 28, 33, 40], "someth": [7, 10, 11, 13, 24, 38], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 13], "horizont": 8, "scale": [8, 39], "backup": 8, "benefit": [8, 40], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 21, 23, 24], "reason": [8, 13, 18, 24, 36, 40], "why": 8, "million": 8, "singl": [8, 13, 33], "capac": 8, "sometim": 8, "traffic": [8, 18, 37, 40], "reachabl": [8, 20], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 13, 20, 21, 23, 24, 27], "expos": [8, 16, 20], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 33], "10903": 8, "10904": 8, "replica": [8, 26, 27, 28, 33, 34, 40], "abov": [8, 21, 23, 24], "last": [8, 24], "db_address": 8, "could": [8, 33, 37, 39, 40], "long": [8, 10, 24, 38], "now": [8, 10, 24], "grafan": 9, "render": [9, 13], "sidecar": 9, "receiv": [9, 10, 40], "distribut": [9, 28, 37, 40], "email": [9, 10], "slack": [9, 10], "displai": [9, 22], "enhanc": [10, 11], "notifi": [10, 11, 33], "wrong": [10, 11, 13, 18, 24, 38, 40], "shown": [10, 18, 21, 23, 24], "overview": [10, 24, 33], "condit": 10, "met": 10, "certain": 10, "defin": [10, 13, 20, 31, 40], "what": [10, 24], "happen": [10, 18], "report": [10, 15, 18, 40], "let": [10, 20], "u": 10, "instancedown": 10, "expr": [10, 13, 24], "60": [10, 24], "sever": [10, 12, 14, 41], "annot": 10, "descript": [10, 33], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 13, 21], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 40], "rout": [10, 28, 40], "repres": 10, "tree": 10, "win": [10, 18], "inhibit": 10, "mute": 10, "via": [10, 18], "sluck": 10, "wors": 10, "correctli": [10, 13, 20, 22], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 22, 24], "reduc": [10, 13, 26], "simul": 10, "actual": [10, 36], "low": [10, 40], "space": 10, "lower": [10, 40], "fire": 10, "show": [10, 13, 15, 24, 40], "propag": 10, "valu": [10, 13, 30, 32, 38, 40], "similar": [10, 13], "free": 10, "big": [10, 40], "bisect": 10, "problem": [10, 33, 39, 40], "explain": [13, 21, 23, 24, 33], "intern": [13, 28, 40], "potenti": [13, 33, 40], "issu": [13, 33, 37, 40], "whenev": 13, "save": 13, "earlier": 13, "overridden": 13, "perman": 13, "eventu": 13, "made": 13, "larg": [13, 33], "maintain": 13, "json": 13, "too": [13, 32, 38], "verbos": 13, "element": [13, 33], "object": 13, "attribut": 13, "graph": [13, 20, 22, 24, 40], "aliascolor": 13, "bar": 13, "error": [13, 24, 33, 34, 36], "fill": [13, 39], "grid": 13, "threshold1": 13, "null": 13, "threshold1color": 13, "rgba": 13, "216": 13, "200": 13, "threshold2": 13, "threshold2color": 13, "234": 13, "112": 13, "gridpo": 13, "w": [13, 18], "x": [13, 18, 19], "y": [13, 19], "id": [13, 18], "isnew": 13, "legend": 13, "avg": 13, "max": 13, "min": 13, "linewidth": 13, "link": [13, 33], "nullpointmod": 13, "percentag": [13, 40], "pointradiu": 13, "flot": 13, "seriesoverrid": 13, "span": 13, "steppedlin": 13, "sum": [13, 24], "node_filesystem_avail": 13, "intervalfactor": 13, "legendformat": 13, "refid": 13, "timefrom": 13, "timeshift": 13, "titl": 13, "size": [13, 29, 40], "tooltip": 13, "msresolut": 13, "share": [13, 32], "sort": [13, 31, 40], "value_typ": 13, "cumul": 13, "transpar": 13, "xaxi": 13, "yax": 13, "percent": 13, "logbas": 13, "101": 13, "short": 13, "imagin": 13, "redund": 13, "resembl": 13, "css": 13, "hierarch": 13, "definit": [13, 20, 40], "inherit": 13, "row": [13, 31, 40], "base_row": 13, "collaps": 13, "height": 13, "250px": 13, "Will": 13, "150px": 13, "output": 13, "consid": 13, "bytes_panel": 13, "byte": 13, "unit": 13, "axi": 13, "adjust": 13, "readabl": 13, "gb": 13, "mb": 13, "grasp": 13, "origin": [13, 24, 35], "12": [13, 18, 24], "wa": [13, 40], "larger": 13, "break": [13, 29, 40], "later": 13, "were": [13, 20, 40], "absolut": 13, "posit": 13, "width": 13, "backward": [13, 18, 20, 22], "ve": 13, "had": 13, "imposs": 13, "hand": 13, "overcom": 13, "transit": [13, 22, 24], "calcul": [13, 24], "taken": [13, 20], "still": [13, 24], "unlik": 13, "partial": 13, "24": [13, 24], "don": [13, 24], "python": 13, "make_dashboard": 13, "revers": [13, 33], "usual": [13, 18, 33, 40], "easier": 13, "wrapper": 13, "re": [13, 28], "just": 13, "refresh": 13, "generate_gener": 13, "ran": 13, "mayb": 13, "interfac": [14, 18], "2021": 15, "2022": 15, "2018": [15, 29], "14": [15, 18], "onlin": 16, "prometheus_port": 16, "prometheus_address": 16, "integr": 17, "56090": 18, "old": [18, 21, 22, 23, 24], "howev": 18, "twice": 18, "easiest": 18, "remov": [18, 20], "scylla_manager1": 18, "messag": 18, "wait": [18, 34], "non": [18, 20, 27, 28, 33, 37, 40], "post": 18, "past": [18, 22], "mai": [18, 32, 33, 34, 40], "ownership": 18, "la": 18, "grep": 18, "drwxr": 18, "xr": 18, "4096": 18, "jun": 18, "51": 18, "chown": 18, "appear": 18, "unreach": [18, 34], "immedi": 18, "suspect": 18, "tab": 18, "rang": [18, 24, 40], "align": 18, "On": [18, 33], "41bd3db26240": 18, "entrypoin": 18, "ago": [18, 24], "23": 18, "7001": 18, "tcp": 18, "9042": 18, "9160": 18, "10000": 18, "click": 18, "usag": [18, 28, 40], "fetch": 18, "curl": 18, "scylla_nod": 18, "return": [18, 20, 25, 26, 27, 29, 34, 36, 40], "ef": 18, "gre": 18, "scylla_setup": 18, "9100": 18, "while": [18, 20, 21, 23, 24, 32], "captur": 18, "tshark": 18, "f": 18, "dst": 18, "eth0": 18, "toward": 18, "199": 18, "203": 18, "229": 18, "89": 18, "142": 18, "59212": 18, "ack": 18, "seq": 18, "317": 18, "78193": 18, "158080": 18, "len": 18, "tsval": 18, "79869679": 18, "tsecr": 18, "3347447210": 18, "74": 18, "60440": 18, "syn": 18, "29200": 18, "mss": 18, "1460": 18, "sack_perm": 18, "79988291": 18, "128": 18, "sinc": 20, "parallel": [20, 21, 23, 24], "migrat": [20, 21, 23], "lose": 20, "histor": [20, 24], "process": [20, 32, 39], "safe": 20, "page": [20, 22, 33], "unzip": [20, 21, 22, 23, 24], "3001": [20, 21, 23, 24], "9091": [20, 21, 23, 24], "9094": 20, "fail": [20, 26, 28, 33, 40], "loss": 20, "everyth": 20, "stop": [20, 21, 22, 23, 24], "format": [20, 24], "rule_fil": 20, "9111": 20, "phase": [20, 22], "serv": 20, "remote_read": 20, "v1": 20, "histori": [20, 22], "continu": [20, 21, 23, 24], "back": [20, 26], "recommend": [21, 23, 24], "uninstal": [21, 23, 24], "minor": [21, 23, 24], "9095": [21, 23, 24], "brows": [21, 23, 24], "satisfi": [21, 23, 24], "shut": [21, 23, 24], "caus": [21, 23, 24, 28, 40], "blackout": [21, 23, 24], "normal": [21, 23, 24], "dure": [21, 23, 24], "oper": [21, 23, 24, 33, 40], "complet": [21, 23, 24], "switch": [22, 24], "fulli": 22, "affect": 22, "helper": 22, "node_exporter_instal": 22, "ship": 22, "sub": 22, "color": 22, "simpli": 22, "side": [23, 24, 25, 33, 40], "newer": [23, 24], "ensur": 24, "patch": 24, "skip": 24, "entir": 24, "promethu": 24, "p99": 24, "write": [24, 27], "latenc": [24, 28, 32, 33, 40], "wlatencyp99": 24, "histogram_quantil": 24, "99": 24, "rate": [24, 40], "scylla_storage_proxy_coordinator_write_latency_bucket": 24, "shard": [24, 33], "scheduling_group_nam": 24, "le": 24, "fall": [24, 26], "mechan": [24, 26], "present": 24, "reli": [24, 40], "miss": 24, "year": 24, "month": 24, "360": 24, "our": 24, "nine": 24, "gap": 24, "minu": 24, "exact": 24, "goe": 24, "revert": 24, "stat": 24, "overlap": 24, "promtool": 24, "90": 24, "epoc": 24, "translat": 24, "mani": [24, 26, 27, 40], "echo": 24, "date": 24, "3600": 24, "exec": 24, "back_fil": 24, "took": 24, "hour": 24, "100": [24, 32, 39], "creation": 24, "inerupt": 24, "split": 24, "smaller": 24, "successfulli": 24, "compact": [24, 39], "half": 24, "primari": [25, 40], "kei": [25, 31, 40], "scan": 25, "These": [25, 40], "kind": [25, 40], "bigger": 25, "care": [25, 26, 27, 40], "replicationfactor": [26, 27], "piec": 26, "determin": [26, 27, 34, 40], "repli": [26, 27, 29, 34, 36, 40], "unavail": [26, 40], "client": [26, 29, 33, 40], "respond": 26, "accompani": 26, "deep": 26, "understand": 26, "acknowledg": 27, "coordin": [27, 28, 34, 36, 40], "hint": 27, "fact": 27, "yet": 27, "ideal": [28, 40], "resourc": [28, 31, 40], "replic": [28, 34, 36, 40], "prepar": [28, 33, 37], "statement": [28, 30, 33, 37], "balanc": [28, 32, 33, 40], "polici": 28, "cours": 28, "intro": 28, "recap": 28, "ring": [28, 40], "architectur": 28, "chunk": [29, 40], "increas": [29, 32, 40], "overal": [29, 32, 40], "thu": 29, "www": [29, 37], "07": 29, "13": 29, "effici": [29, 40], "optim": [30, 37, 41], "concret": 30, "thumb": 30, "alwai": 30, "favor": 30, "partit": [31, 33], "BY": [31, 40], "ineffici": [31, 40], "consum": 31, "doc": 31, "background": [32, 39], "much": [32, 40], "impact": [32, 33], "compaction_static_shar": 32, "50": 32, "indic": [32, 33, 38, 39, 40], "overli": 32, "slow": 32, "enforc": 32, "min_threshold": 32, "compaction_enforce_min_threshold": 32, "bucket": 32, "sstabl": 32, "stc": 32, "recogn": 33, "bad": 33, "practic": [33, 37], "solv": 33, "left": 33, "categori": [33, 40], "jump": 33, "warn": 33, "cell": 33, "model": [33, 37, 39, 40], "imbal": 33, "imbalanc": 33, "hot": 33, "bottleneck": [33, 37], "cach": 33, "hit": 33, "filter": 33, "token": 33, "awar": 33, "order": [33, 40], "due": 33, "unsatisfi": 33, "faulti": 33, "evict": 33, "answer": [34, 36], "aka": 34, "factor": 34, "quorum": [34, 40], "hardwar": [35, 39], "occur": 35, "leav": 36, "risk": 36, "identifi": [36, 40], "evenli": 37, "across": 37, "becom": 37, "explan": 37, "08": 37, "best": 37, "field": 38, "being": 38, "defi": 38, "purpos": 38, "might": 38, "shed": 39, "drop": [39, 40], "repair": 39, "que": 39, "upper": 40, "gaug": 40, "inspect": 40, "zero": 40, "mislead": 40, "panel": 40, "holder": 40, "prevent": 40, "inject": 40, "did": 40, "compound": 40, "column": 40, "ks1": 40, "table_demo": 40, "text": 40, "int": 40, "desc": 40, "cat1": 40, "asc": 40, "overhead": 40, "thing": 40, "major": 40, "success": 40, "hurt": 40, "cl": 40, "expens": 40, "term": 40, "cost": 40, "ONE": 40, "local_quorum": 40, "local_on": 40, "nearest": 40, "advisor": 41}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 27, 33, 41], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 33, 41], "stack": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 33, 41], "us": [2, 5, 6, 8, 13, 25, 26, 27, 31, 41], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 13], "set": [2, 5, 20, 21, 23, 24], "prometheu": [2, 4, 5, 6, 7, 8, 10, 16, 20], "grafana": [2, 5, 6, 7, 13, 18], "provis": 2, "data": [2, 6, 8, 18, 24], "sourc": [2, 8, 18], "file": [2, 6, 18, 21, 23, 24], "dashboard": [2, 6, 13], "load": 2, "start": [2, 6, 7, 18, 24], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 20, 21, 22, 23, 24], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 13, 20, 39], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 35], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 32], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 18], "configur": [5, 6, 8], "enabl": 5, "compat": 6, "matrix": [6, 15], "post": [6, 24, 29, 37], "node": [6, 35], "from": [6, 13], "manag": [6, 7, 11, 18], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 18], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": [6, 20, 21, 22, 23, 24], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 13, 21, 23, 24, 33, 40], "all": [7, 21, 23, 24, 26], "sh": [7, 13], "command": 7, "gener": [7, 13], "option": 7, "relat": [7, 20, 21, 22, 23, 24], "ldap": 7, "support": [7, 15], "retent": 7, "period": [7, 24], "alert": [7, 10, 11, 20], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 25, 26, 27, 28, 29, 30, 31, 37, 40], "updat": 8, "high": 9, "level": [9, 18, 26, 27, 34, 40], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 13], "procedur": [12, 20, 21, 22, 23, 24], "modifi": 13, "limit": 13, "consist": [13, 26, 27, 34, 40], "between": 13, "restart": [13, 24], "upgrad": [13, 18, 19, 20, 21, 22, 23, 24], "templat": 13, "class": 13, "panel": 13, "exampl": 13, "format": 13, "layout": 13, "valid": [13, 20, 21, 22, 23, 24], "refer": 14, "guid": [14, 17, 20, 21, 22, 23, 24], "interfac": 16, "troubleshoot": [17, 18], "problem": 18, "2": [18, 20, 21, 22], "duplic": 18, "inform": 18, "A": 18, "contain": [18, 21, 23, 24], "fail": [18, 34, 36], "To": 18, "And": 18, "permiss": 18, "No": 18, "point": 18, "solut": 18, "chart": 18, "show": 18, "error": [18, 35], "sign": 18, "server": [18, 21, 23, 24], "metric": [18, 24], "notic": 18, "open": 18, "3": [18, 20, 22, 23, 24], "0": 18, "enterpris": 18, "2019": 18, "1": [18, 20, 22], "work": 18, "wireshark": 18, "x": [20, 21, 22, 23, 24], "latest": 20, "new": [20, 21, 22, 23, 24], "rule": 20, "4": [20, 24], "move": [20, 21, 23, 24], "old": 20, "b": 20, "rollback": [20, 21, 22, 23, 24], "link": [20, 21, 22, 23, 24, 27, 28, 29, 31, 37], "y": [21, 23, 24], "": [21, 23, 24], "i": [21, 23, 24, 35], "run": [21, 23, 24], "correct": [21, 23, 24], "correctli": [21, 23], "kill": [21, 23, 24], "node_export": 22, "test": [23, 24], "mode": [23, 24], "second": 24, "migrat": 24, "backup": 24, "back": 24, "fill": 24, "determin": 24, "backfil": 24, "time": 24, "end": 24, "process": 24, "creat": 24, "copi": 24, "some": [25, 26, 27, 28, 29, 30, 31, 34, 36], "allow": [25, 40], "filter": [25, 40], "ani": 27, "univers": [27, 28], "ar": [28, 29, 30, 37], "token": [28, 40], "awar": [28, 40], "select": 29, "non": [29, 30], "page": [29, 40], "blog": [29, 37], "prepar": [30, 38, 40], "revers": [31, 40], "order": 31, "document": 31, "compact": 32, "take": 32, "lot": 32, "cpu": 32, "advisor": 33, "section": 33, "oper": [34, 36], "due": 34, "unsatisfi": 34, "o": 35, "can": 35, "indic": 35, "faulti": 35, "replica": 36, "side": 36, "cql": [37, 40], "balanc": 37, "among": 37, "shard": 37, "statement": [38, 40], "cach": 38, "evict": 38, "overload": 39, "optim": 40, "read": 40, "cross": 40, "dc": 40, "request": 40}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"CQL queries are not balanced among shards": [[37, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[37, "blog-post-link"]], "I/O Errors can indicate a node with a faulty disk": [[35, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some operations failed on the replica side": [[36, "some-operations-failed-on-the-replica-side"]], "Prepared statements cache eviction": [[38, "prepared-statements-cache-eviction"]], "System Overload": [[39, "system-overload"]], "Some queries use reverse order": [[31, "some-queries-use-reverse-order"]], "Documentation link": [[31, "documentation-link"]], "Scylla Monitoring Stack Advisor": [[33, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[33, "the-advisor-section"]], "Compaction takes lots of memory and CPU": [[32, "compaction-takes-lots-of-memory-and-cpu"]], "Some queries are non-prepared": [[30, "some-queries-are-non-prepared"]], "Some operation failed due to unsatisfied consistency level": [[34, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[23, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Upgrade Procedure": [[23, "upgrade-procedure"], [20, "upgrade-procedure"], [22, "upgrade-procedure"], [21, "upgrade-procedure"], [24, "upgrade-procedure"]], "Install 3.y (The new version)": [[23, "install-3-y-the-new-version"]], "Setting the server\u2019s files": [[23, "setting-the-server-s-files"], [21, "setting-the-server-s-files"], [24, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[23, "validate-the-new-version-is-running-the-correct-version"], [21, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[23, "validate-the-version-installed-correctly"], [21, "validate-the-version-installed-correctly"]], "Killing the new 3.y Monitoring stack in testing mode": [[23, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[23, "move-to-version-3-y-the-new-version"]], "Kill all containers": [[23, "kill-all-containers"], [21, "kill-all-containers"], [24, "kill-all-containers"]], "Rollback to version 3.x": [[23, "rollback-to-version-3-x"], [24, "rollback-to-version-3-x"]], "Related Links": [[23, "related-links"], [20, "related-links"], [22, "related-links"], [21, "related-links"], [24, "related-links"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[20, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[20, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[20, "install-the-new-monitoring-stack"], [22, "install-the-new-monitoring-stack"]], "Validation": [[20, "validation"], [13, "validation"]], "3. Alerting Rules": [[20, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[20, "moving-to-prometheus-2-x"]], "a. Set the old system": [[20, "a-set-the-old-system"]], "b. Set the new system": [[20, "b-set-the-new-system"]], "Validate the upgrade": [[20, "validate-the-upgrade"], [22, "validate-the-upgrade"]], "Rollback": [[20, "rollback"], [22, "rollback"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[22, "validate-node-exporter-version"]], "Some queries use Consistency Level: ALL": [[26, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[21, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[21, "install-2-y-the-new-version"]], "Move to version 2.y (the new version)": [[21, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[21, "rollback-to-version-2-x"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[24, "install-4-y-the-new-version"]], "Running in test mode": [[24, "running-in-test-mode"]], "Running second monitoring stack": [[24, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[24, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[24, "migrating"]], "Move to version 4.y (the new version)": [[24, "move-to-version-4-y-the-new-version"]], "Backup": [[24, "backup"]], "Post-installation: Metrics back-filling": [[24, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[24, "determine-the-backfilling-period"]], "Determine the start time": [[24, "determine-the-start-time"]], "Determine the end time": [[24, "determine-the-end-time"]], "Backfilling Process": [[24, "backfilling-process"]], "backup": [[24, "id1"]], "Restart the monitoring stack": [[24, "restart-the-monitoring-stack"]], "Create the data files": [[24, "create-the-data-files"]], "Copy the data files": [[24, "copy-the-data-files"]], "Some SELECT queries are non-paged": [[29, "some-select-queries-are-non-paged"]], "Blog-post Links": [[29, "blog-post-links"]], "Some queries use Consistency Level: ANY": [[27, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[27, "link-to-scylla-university"]], "Some queries are not token-aware": [[28, "some-queries-are-not-token-aware"]], "University link": [[28, "university-link"]], "Some queries use ALLOW FILTERING": [[25, "some-queries-use-allow-filtering"]], "Scylla Monitoring Stack Procedures": [[12, "scylla-monitoring-stack-procedures"]], "Troubleshoot Scylla Monitoring Stack": [[18, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[18, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[18, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[18, "a-container-fails-to-start"]], "Files And Directory Permissions": [[18, "files-and-directory-permissions"]], "No Data Points": [[18, "no-data-points"]], "Solution": [[18, "solution"], [18, "id1"], [18, "id2"], [18, "id3"]], "Grafana Chart Shows Error (!) Sign": [[18, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[18, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[18, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[18, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[18, "working-with-wireshark"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[17, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Upgrade Scylla Monitoring Stack": [[19, "upgrade-scylla-monitoring-stack"]], "Scylla Monitoring Stack Interfaces": [[16, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[16, "prometheus"]], "Scylla Monitoring Stack Support Matrix": [[15, "scylla-monitoring-stack-support-matrix"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Stack Reference Guide": [[14, "scylla-monitoring-stack-reference-guide"]], "Adding and Modifying Dashboards": [[13, "adding-and-modifying-dashboards"]], "General Limitations": [[13, "general-limitations"]], "Consistency Between Restarts": [[13, "consistency-between-restarts"]], "Consistency Between Upgrades": [[13, "consistency-between-upgrades"]], "Using Templated Dashboards": [[13, "using-templated-dashboards"]], "The Template Class System": [[13, "the-template-class-system"]], "Panel Example": [[13, "panel-example"]], "Grafana Formats and Layouts": [[13, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[13, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[13, "prerequisite"], [2, "prerequisite"]], "The CQL Optimization": [[40, "the-cql-optimization"]], "Prepared Statements": [[40, "prepared-statements"]], "Token Aware": [[40, "token-aware"]], "Paged Queries": [[40, "paged-queries"]], "Reversed CQL Reads": [[40, "reversed-cql-reads"]], "ALLOW FILTERING": [[40, "allow-filtering"]], "Consistency Level": [[40, "consistency-level"]], "Cross DC": [[40, "cross-dc"]], "Cross DC Consistency Level": [[40, "cross-dc-consistency-level"]], "Cross DC read requests": [[40, "cross-dc-read-requests"]], "Using Scylla Monitoring Stack": [[41, "using-scylla-monitoring-stack"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[5, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Scylla Monitoring Stack": [[9, "scylla-monitoring-stack"], [1, "scylla-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.0/sitemap.xml b/branch-4.0/sitemap.xml new file mode 100644 index 000000000..66cb4c810 --- /dev/null +++ b/branch-4.0/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.0/troubleshooting/index.html b/branch-4.0/troubleshooting/index.html new file mode 100644 index 000000000..337c04e48 --- /dev/null +++ b/branch-4.0/troubleshooting/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Troubleshooting Guide for Scylla Monitoring Stack

                    +
                    +
                    +

                    Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/troubleshooting/monitor_troubleshoot.html b/branch-4.0/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..09547973f --- /dev/null +++ b/branch-4.0/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,868 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Troubleshoot Scylla Monitoring Stack

                    +

                    This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                    +
                    +

                    Problem

                    +
                    +

                    Scylla-Manager 2.2 with Duplicate information

                    +

                    Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                    +
                      +
                    • For Manager server: from 56090 to 5090

                    • +
                    • For Manager Agent: from 56090 to 5090

                    • +
                    +

                    For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                    +

                    However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                    +

                    The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                    +

                    Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                    +
                    +
                    +

                    A Container Fails To Start

                    +

                    When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                    +
                    Wait for Prometheus container to start........Error: Prometheus container failed to start
                    +
                    +
                    +

                    Should this happen, check the Docker logs for more information.

                    +
                    docker logs aprom
                    +
                    +
                    +

                    Usually the reason for the failure is described in the logs.

                    +
                    +
                    +

                    Files And Directory Permissions

                    +
                    +

                    Note

                    +

                    Avoid running Docker containers as root.

                    +
                    +

                    The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                    +

                    If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                    +
                    +

                    Note

                    +

                    If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                    +
                    +

                    For example if your Prometheus data directory is /prom-data and you are using centos user

                    +
                    ls -la /|grep prom-data
                    +
                    +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                    +
                    +sudo chown -R centos:centos /prom-data
                    +
                    +ls -la /|grep prom-data
                    +
                    +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                    +
                    +
                    +
                    +
                    +

                    No Data Points

                    +

                    No data points on all data charts.

                    +
                    +

                    Solution

                    +

                    If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                    +
                      +
                    1. Login to the Prometheus console:

                    2. +
                    3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                    4. +
                    5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                    6. +
                    +
                    +
                      +
                    • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                    • +
                    • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                    • +
                    • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                    • +
                    +
                    +

                    For example:

                    +
                    ./start-all.sh -v 3.1
                    +
                    +
                    +

                    More on start-all.sh options.

                    +
                    +
                    +
                    +

                    Grafana Chart Shows Error (!) Sign

                    +

                    Run this procedure on the Scylla Monitoring Stack server.

                    +

                    If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                    +
                    +

                    Solution

                    +

                    On the Scylla Monitoring Stack server:

                    +
                      +
                    1. Check Prometheus is running using docker ps.

                    2. +
                    +
                      +
                    • If it is not running check the prometheus.yml for errors.

                    • +
                    +

                    For example:

                    +
                    CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                    +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                    +
                    +
                    +
                      +
                    • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                    • +
                    +
                    +
                    +
                    +

                    Grafana Shows Server Level Metrics, but not Scylla Metrics

                    +

                    Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                    +
                    +

                    Solution

                    +
                      +
                    • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                    • +
                    +

                    For example

                    +
                    curl 172.17.0.2:9180/metrics
                    +
                    +
                    +
                    +
                    +
                    +

                    Grafana Shows Scylla Metrics, but not Server Level Metrics

                    +

                    Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                    +
                    +

                    Solution

                    +

                    1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                    +
                      +
                    1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                    2. +
                    +
                    +
                    +

                    Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                    +

                    While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                    +

                    If the node_exporter service is not starting it may need to be updated manually.

                    +

                    Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                    +
                    +
                    +
                    +

                    Working with Wireshark

                    +

                    No metrics shown in the Scylla Monitoring Stack.

                    +
                      +
                    1. Install wireshark

                    2. +
                    +

                    2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                    +

                    For example:

                    +
                    tshark -i eth0 -f "dst port 9180"
                    +
                    +
                    +

                    Capture from Scylla node towards Scylla Monitoring Stack server.

                    +

                    In this example, Scylla is running.

                    +
                    Monitor ip        Scylla node ip
                    +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                    +
                    +
                    +

                    In this example, Scylla is not running

                    +
                    Monitor ip        Scylla node ip
                    +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                    +
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/index.html b/branch-4.0/upgrade/index.html new file mode 100644 index 000000000..c2eae7710 --- /dev/null +++ b/branch-4.0/upgrade/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Scylla Monitoring Stack

                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.0/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..6f660c74c --- /dev/null +++ b/branch-4.0/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,795 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                    +

                    This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

                    +

                    Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                    +
                    +

                    Upgrade Procedure

                    +
                    +

                    1. Upgrade to the latest 1.x version

                    +

                    Before starting the upgrade procedure, make sure you are running the latest 1.x version

                    +
                    +
                    +

                    2. Install the new monitoring stack

                    +
                      +
                    1. Download the 2.x version from the release page.

                    2. +
                    3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                    4. +
                    5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                      +
                        +
                      • scylla_servers.yml

                      • +
                      • scylla_manager_servers.yml

                      • +
                      • node_exporter_servers.yml

                      • +
                      +
                    6. +
                    7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                    8. +
                    +
                    ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                    +
                    +
                    +
                    +

                    Note

                    +

                    Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                    +
                    +

                    While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                    +
                    ./kill-all.sh -g 3001 -p 9091 -m 9094
                    +
                    +
                    +
                    +

                    Validation

                    +

                    Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                    +
                    +
                    +
                    +

                    3. Alerting Rules

                    +

                    Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                    +
                    +
                    +

                    4. Moving to Prometheus 2.x

                    +

                    Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                    +

                    Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                    +
                    +

                    a. Set the old system

                    +

                    The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                    +
                      +
                    • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                    • +
                    • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                    • +
                    +
                    +

                    Note

                    +

                    After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                    +
                    +
                    +
                    +

                    b. Set the new system

                    +

                    The following step will allow the new monitoring system to read historical metrics from the old system.

                    +
                      +
                    • In the Prometheus prometheus.yml.template file add the following at the end:

                    • +
                    +
                    remote_read:
                    +  - url: "http://{ip}:9111/api/v1/read"
                    +
                    +
                    +

                    Where {ip} is the ip of the old system.

                    +
                      +
                    • restart the new stack

                    • +
                    +
                    +
                    +
                    +

                    Validate the upgrade

                    +

                    You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                    +
                    +
                    +
                    +

                    Rollback

                    +

                    In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                    +
                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..fca52a150 --- /dev/null +++ b/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,789 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                    +

                    This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                    +
                    +

                    Upgrade Procedure

                    +

                    We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                    +

                    Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                    +
                    +

                    Install 2.y (The new version)

                    +
                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                    +unzip scylla-monitoring-2.y.zip
                    +cd scylla-monitoring-scylla-monitoring-2.y/
                    +
                    +
                    +

                    Replace “y” with the new minor release number, for example, 2.1.zip

                    +
                    +
                    +

                    Setting the server’s files

                    +

                    Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                    +
                    cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                    +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                    +
                    +
                    +
                    +
                    +

                    Validate the new version is running the correct version

                    +

                    Starting from Scylla-Monitoring version 2.2, you can run:

                    +
                    ./start-all.sh --version
                    +
                    +
                    +

                    To validate the Scylla-Monitoring version.

                    +
                    +
                    +

                    Validate the version installed correctly

                    +

                    To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                    +
                    ./start-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    Browse to http://{ip}:9091 +And check the Grafana dashboard

                    +

                    Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                    +
                    +

                    Caution

                    +

                    Important: do not use the local dir flag when testing!

                    +
                    +

                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                    +
                    +

                    Caution

                    +

                    Important: Do not kill the 2.x version that is currently running.

                    +
                    +

                    Use the following command to kill the containers:

                    +
                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    You can start and stop the new 2.y version while testing.

                    +
                    +
                    +

                    Move to version 2.y (the new version)

                    +

                    Note: migrating will cause a few seconds of blackout in the system.

                    +

                    We assume that you are using external volume to store the metrics data.

                    +
                    +

                    Kill all containers

                    +

                    Follow the instruction on how to kill the 2.y version when in testing mode.

                    +

                    To kill the 2.x version containers, run:

                    +
                    ./kill-all.sh
                    +
                    +
                    +

                    Start version 2.y in normal mode

                    +

                    From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                    +
                    ./start-all.sh -d /path/to/data/dir
                    +
                    +
                    +

                    Point your browser to http://{ip}:3000 and see that the data is there.

                    +
                    +
                    +
                    +

                    Rollback to version 2.x

                    +

                    To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                    +

                    To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                    +
                    ./kill-all.sh
                    +cd /path/to/scylla-grafana-2.x/
                    +./start-all.sh -d /path/to/data/dir
                    +
                    +
                    +
                    +
                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..0a86b6e5d --- /dev/null +++ b/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                    +

                    This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

                    +

                    Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                    +
                    +

                    Upgrade Procedure

                    +
                    +

                    1. Validate node_exporter version

                    +

                    Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                    +

                    If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                    +
                    +
                    +

                    2. Install the new monitoring stack

                    +
                      +
                    1. Download the 3.x version from the release page.

                    2. +
                    3. Unzip it into a different directory.

                    4. +
                    5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                      +
                        +
                      • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                      • +
                      • scylla_manager_servers.yml

                      • +
                      +
                      +
                      +

                      Note

                      +

                      The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                      +
                      +
                      +
                    6. +
                    7. Stop the old monitoring stack

                      +
                      +
                      ./kill-all.sh
                      +
                      +
                      +
                      +
                    8. +
                    9. Start the new monitoring stack

                      +
                      +
                      ./start-all.sh -d /prometheus-data-path
                      +
                      +
                      +
                      +
                    10. +
                    +
                    +
                    +

                    Validate the upgrade

                    +

                    You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                    +

                    Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                    +
                    +
                    +
                    +

                    Rollback

                    +

                    To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                    +
                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..e81be4524 --- /dev/null +++ b/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,797 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                    +

                    This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                    +
                    +

                    Upgrade Procedure

                    +

                    We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                    +

                    Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                    +
                    +

                    Install 3.y (The new version)

                    +
                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                    +unzip scylla-monitoring-3.y.zip
                    +cd scylla-monitoring-scylla-monitoring-3.y/
                    +
                    +
                    +

                    Replace “y” with the new minor release number, for example, 3.0.1.zip

                    +
                    +
                    +

                    Setting the server’s files

                    +

                    Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                    +
                    cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                    +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                    +
                    +
                    +
                    +
                    +

                    Validate the new version is running the correct version

                    +

                    Starting from Scylla-Monitoring version 2.2, you can run:

                    +
                    ./start-all.sh --version
                    +
                    +
                    +

                    To validate the Scylla-Monitoring version.

                    +
                    +
                    +

                    Validate the version installed correctly

                    +

                    To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                    +
                    ./start-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    Browse to http://{ip}:9091 +And check the Grafana dashboard

                    +

                    Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                    +
                    +

                    Caution

                    +

                    Important: do not use the local dir flag when testing!

                    +
                    +

                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                    +
                    +

                    Caution

                    +

                    Important: Do not kill the 3.x version that is currently running.

                    +
                    +
                    +
                    +

                    Killing the new 3.y Monitoring stack in testing mode

                    +

                    Use the following command to kill the containers:

                    +
                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    You can start and stop the new 3.y version while testing.

                    +
                    +
                    +

                    Move to version 3.y (the new version)

                    +

                    Note: migrating will cause a few seconds of blackout in the system.

                    +

                    We assume that you are using external volume to store the metrics data.

                    +
                    +

                    Kill all containers

                    +

                    At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                    +

                    Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                    +

                    kill the older 3.x version containers by running:

                    +
                    ./kill-all.sh
                    +
                    +
                    +

                    Start version 3.y in normal mode

                    +

                    From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                    +
                    ./start-all.sh -d /path/to/data/dir
                    +
                    +
                    +

                    Point your browser to http://{ip}:3000 and see that the data is there.

                    +
                    +
                    +
                    +

                    Rollback to version 3.x

                    +

                    To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                    +

                    To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                    +
                    ./kill-all.sh
                    +cd /path/to/scylla-grafana-3.x/
                    +./start-all.sh -d /path/to/data/dir
                    +
                    +
                    +
                    +
                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..79564c3a2 --- /dev/null +++ b/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,940 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                    +

                    This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                    +
                    +

                    Upgrade Procedure

                    +

                    We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                    +

                    Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                    +
                    +

                    Install 4.y (The new version)

                    +
                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                    +unzip scylla-monitoring-4.y.zip
                    +cd scylla-monitoring-scylla-monitoring-4.y/
                    +
                    +
                    +

                    Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                    +
                    +
                    +

                    Setting the server’s files

                    +

                    Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                    +
                    cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                    +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                    +
                    +
                    +
                    +
                    +

                    Validate the new version is running the correct version

                    +

                    run:

                    +
                    ./start-all.sh --version
                    +
                    +
                    +

                    To validate the Scylla-Monitoring version.

                    +
                    +
                    +
                    +

                    Running in test mode

                    +

                    This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                    +
                    +

                    Running second monitoring stack

                    +

                    We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                    +
                    ./start-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    Browse to http://{ip}:9091 and check the Grafana dashboard.

                    +

                    Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                    +
                    +

                    Caution

                    +

                    Important: do not use the local dir flag when testing!

                    +
                    +

                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                    +
                    +

                    Caution

                    +

                    Important: Do not kill the 3.x version that is currently running!

                    +
                    +
                    +
                    +

                    Killing the new 4.y Monitoring stack in testing mode

                    +

                    Use the following command to kill the containers:

                    +
                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    You can start and stop the new 4.y version while testing.

                    +
                    +
                    +
                    +

                    Migrating

                    +
                    +

                    Move to version 4.y (the new version)

                    +

                    Note: migrating will cause a few seconds of blackout in the system.

                    +

                    We assume that you are using external volume to store the metrics data.

                    +
                    +

                    Backup

                    +

                    We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                    +
                    +
                    +

                    Kill all containers

                    +

                    At this point you have two monitoring stacks installed with the older version running.

                    +

                    If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                    +

                    kill the older 3.x version containers by running:

                    +
                    ./kill-all.sh
                    +
                    +
                    +

                    Start version 4.y in normal mode

                    +

                    From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                    +
                    ./start-all.sh -d /path/to/copy/data/dir
                    +
                    +
                    +

                    Point your browser to http://{ip}:3000 and see that the data is there.

                    +
                    +
                    +
                    +

                    Rollback to version 3.x

                    +

                    To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                    +

                    To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                    +
                    ./kill-all.sh
                    +cd /path/to/scylla-grafana-3.x/
                    +./start-all.sh -d /path/to/original/data/dir
                    +
                    +
                    +
                    +
                    +
                    +

                    Post-installation: Metrics back-filling

                    +

                    Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                    +

                    For example, this is a recording rule that calculates the p99 write latency:

                    +
                    - record: wlatencyp99
                    +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                    +  labels:
                    +    by: "instance,shard"
                    +
                    +
                    +

                    For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                    +

                    Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                    +
                    +
                    +

                    Note

                    +

                    If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                    +
                    +
                    +
                    +../_images/before-backfilling.png +
                    +

                    This is an example of missing latency graph

                    +
                    +
                    +

                    The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                    +

                    For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                    +

                    In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                    +

                    The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                    +
                    +

                    Determine the backfilling period

                    +

                    When you run the backfilling process you need to determine the start time and end time.

                    +
                    +

                    Determine the start time

                    +

                    The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                    +

                    If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                    +

                    For the rest of this example, we will assume that your retention time is 360 days.

                    +
                    +
                    +

                    Determine the end time

                    +

                    Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                    +

                    If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                    +

                    That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                    +

                    The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                    +
                    +
                    +
                    +

                    Backfilling Process

                    +
                    +

                    backup

                    +

                    If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                    +

                    To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                    +
                    +
                    +

                    Restart the monitoring stack

                    +

                    You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                    +

                    -b "--storage.tsdb.allow-overlapping-blocks"

                    +
                    +
                    +

                    Create the data files

                    +

                    We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                    +

                    The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                    +

                    Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                    +
                    docker exec -it aprom sh
                    +cd /prometheus/data/
                    +promtool tsdb create-blocks-from rules \
                    +--start $start \
                    +--end $end \
                    +--url http://localhost:9090 \
                    +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                    +
                    +
                    +

                    It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                    +
                    +
                    +

                    Note

                    +

                    Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                    +
                    +
                    +
                    +
                    +

                    Copy the data files

                    +

                    Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                    +

                    Copy the data files to the Prometheus directory:

                    +
                    cp data/* .
                    +
                    +
                    +

                    The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                    +

                    Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                    +
                    +../_images/after-backfilling.jpg +
                    +

                    Un example: after loading half of the data

                    +
                    +
                    +
                    +
                    +
                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.0/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..de25ce7e3 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries use ALLOW FILTERING

                    +

                    Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                    +

                    These kinds of queries can create a bigger load on Scylla, and should be used with care.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlCLAll.html b/branch-4.0/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..2a4bbcaa5 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries use Consistency Level: ALL

                    +

                    Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                    +

                    Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                    +

                    Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlCLAny.html b/branch-4.0/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..73c100891 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries use Consistency Level: ANY

                    +

                    Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                    +

                    Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.0/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..780e3cac8 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries are not token-aware

                    +

                    Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                    +

                    Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlNonPaged.html b/branch-4.0/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..7a673f299 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some SELECT queries are non-paged

                    +

                    By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                    +
                    +

                    Blog-post Links

                    +

                    https://www.scylladb.com/2018/07/13/efficient-query-paging/

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.0/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..411d3a9ee --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries are non-prepared

                    +

                    Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlReverseOrder.html b/branch-4.0/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..2c3f4f26f --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries use reverse order

                    +

                    Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                    +

                    Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/heavyCompaction.html b/branch-4.0/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..9889436c8 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,697 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Compaction takes lots of memory and CPU

                    +

                    ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                    +

                    If this is the case, you can do one of the following:

                    +
                      +
                    • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                      +
                      +
                        +
                      • In the scylla.yml configuration file: compaction_static_shares: 100

                      • +
                      • In the command line when starting ScyllaDB: --compaction-static-shares 100

                      • +
                      +
                      +

                      You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                      +
                    • +
                    • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                    • +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/index.html b/branch-4.0/use-monitoring/advisor/index.html new file mode 100644 index 000000000..ce2d3587d --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/index.html @@ -0,0 +1,714 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Advisor

                    +
                    +
                    +

                    The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                    +
                    +

                    The Advisor section

                    +
                    +../../_images/advisor_panel.png +
                    +

                    The Advisor section

                    +
                    +
                    +

                    The Advisor section is located on the Overview dashboard and consists of two parts:

                    +

                    On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                    +

                    For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                    +

                    On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                    +

                    For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                    +

                    Each Advisor issue is explained in detail:

                    + +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/nodeCLErrors.html b/branch-4.0/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..c9bf14f5f --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Some operation failed due to unsatisfied consistency level

                    +

                    ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                    +

                    For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                    +

                    When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/nodeIOErrors.html b/branch-4.0/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..c7ffb1668 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    I/O Errors can indicate a node with a faulty disk

                    +

                    I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.0/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..9ed0de8f0 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Some operations failed on the replica side

                    +

                    ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                    +

                    An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.0/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..34b75c267 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    CQL queries are not balanced among shards

                    +

                    For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                    +

                    There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                    +
                    +

                    Blog post link

                    +

                    https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.0/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..ff3384407 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Prepared statements cache eviction

                    +

                    Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                    +
                      +
                    • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                    • +
                    • The prepared statements cache might be too small for the number of prepared statements.

                    • +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/systemOverload.html b/branch-4.0/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..1cfef67ce --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    System Overload

                    +

                    There could be multiple indications that a system is overloaded:

                    +
                      +
                    • Timeouts

                    • +
                    • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                    • +
                    • CPU at 100% when no background process (like compaction or repair) runs.

                    • +
                    • Ques are getting filled.

                    • +
                    +

                    If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/cql_optimization.html b/branch-4.0/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..f08457a99 --- /dev/null +++ b/branch-4.0/use-monitoring/cql_optimization.html @@ -0,0 +1,801 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    The CQL Optimization

                    +

                    The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                    +
                    +../_images/cql_optimization_master.png +
                    +

                    The CQL Dashboard

                    +
                    +
                    +

                    The upper part of the dashboard holds CQL related metrics.

                    +

                    The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                    +
                    +

                    Note

                    +

                    Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                    +
                    +

                    The following sections describe each of the dashboard’s panel

                    +
                    +

                    Prepared Statements

                    +

                    Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                    +

                    Using prepared statements has the following benefits:

                    +
                      +
                    • The database only needs to parse the query once

                    • +
                    • The driver can route the query to the right node

                    • +
                    • Using place-holders and values is safer and prevents CQL-Injection

                    • +
                    +

                    The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                    +

                    The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                    +
                    +
                    +

                    Token Aware

                    +

                    Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                    +

                    Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                    +

                    The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                    +

                    The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                    +
                    +
                    +

                    Paged Queries

                    +

                    By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                    +

                    The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                    +

                    The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                    +
                    +
                    +

                    Reversed CQL Reads

                    +

                    Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                    +

                    Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                    +

                    For example, look at the following table:

                    +
                    CREATE TABLE ks1.table_demo (
                    +   category text,
                    +   type int,
                    +   PRIMARY KEY (category, type))
                    +WITH CLUSTERING ORDER BY (type DESC);
                    +
                    +
                    +

                    The following query uses reverse order:

                    +
                    select * from ks1.table_demo where category='cat1' order by type ASC;
                    +
                    +
                    +

                    The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                    +

                    The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                    +
                    +
                    +

                    ALLOW FILTERING

                    +

                    Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                    +

                    These kinds of queries can create a big load on the system, and should be used with care.

                    +

                    The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                    +

                    The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                    +

                    The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                    +

                    The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                    +

                    The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                    +
                    +
                    +

                    Consistency Level

                    +

                    Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                    +

                    The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                    +

                    Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                    +

                    The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                    +

                    The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                    +

                    The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                    +

                    The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                    +
                    +
                    +

                    Cross DC

                    +

                    Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                    +
                    +
                    +

                    Cross DC Consistency Level

                    +

                    Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                    +
                    +
                    +

                    Cross DC read requests

                    +
                    +

                    Note

                    +

                    The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                    +
                    +

                    In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                    +

                    The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/index.html b/branch-4.0/use-monitoring/index.html new file mode 100644 index 000000000..ff68ec87e --- /dev/null +++ b/branch-4.0/use-monitoring/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Using Scylla Monitoring Stack

                    +
                    +
                    +

                    There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.1/.buildinfo b/branch-4.1/.buildinfo new file mode 100644 index 000000000..460fe8d4e --- /dev/null +++ b/branch-4.1/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 7fd2160ea4abc6d25c8404898818ef5e +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.1/.doctrees/_common/monitor-description.doctree b/branch-4.1/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..482568b81 Binary files /dev/null and b/branch-4.1/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-4.1/.doctrees/environment.pickle b/branch-4.1/.doctrees/environment.pickle new file mode 100644 index 000000000..dfdc3bc1f Binary files /dev/null and b/branch-4.1/.doctrees/environment.pickle differ diff --git a/branch-4.1/.doctrees/index.doctree b/branch-4.1/.doctrees/index.doctree new file mode 100644 index 000000000..19d1081f6 Binary files /dev/null and b/branch-4.1/.doctrees/index.doctree differ diff --git a/branch-4.1/.doctrees/install/docker_compose.doctree b/branch-4.1/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..fabe814a2 Binary files /dev/null and b/branch-4.1/.doctrees/install/docker_compose.doctree differ diff --git a/branch-4.1/.doctrees/install/index.doctree b/branch-4.1/.doctrees/install/index.doctree new file mode 100644 index 000000000..dcb043467 Binary files /dev/null and b/branch-4.1/.doctrees/install/index.doctree differ diff --git a/branch-4.1/.doctrees/install/min-prod-hw.doctree b/branch-4.1/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..d0b0712dc Binary files /dev/null and b/branch-4.1/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.1/.doctrees/install/monitor_without_docker.doctree b/branch-4.1/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..805747acd Binary files /dev/null and b/branch-4.1/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-4.1/.doctrees/install/monitoring_stack.doctree b/branch-4.1/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..acc7faf99 Binary files /dev/null and b/branch-4.1/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-4.1/.doctrees/install/start_all.doctree b/branch-4.1/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..5675b3f4c Binary files /dev/null and b/branch-4.1/.doctrees/install/start_all.doctree differ diff --git a/branch-4.1/.doctrees/install/thanos.doctree b/branch-4.1/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..5fba5fa59 Binary files /dev/null and b/branch-4.1/.doctrees/install/thanos.doctree differ diff --git a/branch-4.1/.doctrees/intro.doctree b/branch-4.1/.doctrees/intro.doctree new file mode 100644 index 000000000..91d9c9c3c Binary files /dev/null and b/branch-4.1/.doctrees/intro.doctree differ diff --git a/branch-4.1/.doctrees/procedures/alerts/alerting.doctree b/branch-4.1/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..eaa29763c Binary files /dev/null and b/branch-4.1/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.1/.doctrees/procedures/alerts/index.doctree b/branch-4.1/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..511bb49d0 Binary files /dev/null and b/branch-4.1/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.1/.doctrees/procedures/datadog/index.doctree b/branch-4.1/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..a3a1ab32d Binary files /dev/null and b/branch-4.1/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.1/.doctrees/procedures/index.doctree b/branch-4.1/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..660ae1373 Binary files /dev/null and b/branch-4.1/.doctrees/procedures/index.doctree differ diff --git a/branch-4.1/.doctrees/procedures/updating_dashboard.doctree b/branch-4.1/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..92d4f9472 Binary files /dev/null and b/branch-4.1/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-4.1/.doctrees/reference/index.doctree b/branch-4.1/.doctrees/reference/index.doctree new file mode 100644 index 000000000..df7dc2dcc Binary files /dev/null and b/branch-4.1/.doctrees/reference/index.doctree differ diff --git a/branch-4.1/.doctrees/reference/matrix.doctree b/branch-4.1/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..10e4c12bc Binary files /dev/null and b/branch-4.1/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.1/.doctrees/reference/monitoring_apis.doctree b/branch-4.1/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..adbc02ebc Binary files /dev/null and b/branch-4.1/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-4.1/.doctrees/troubleshooting/index.doctree b/branch-4.1/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..58a4c447a Binary files /dev/null and b/branch-4.1/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.1/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-4.1/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..70a940dc4 Binary files /dev/null and b/branch-4.1/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/index.doctree b/branch-4.1/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..63ada90ba Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..b0bc9041f Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..4ca08f571 Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..c077f10b9 Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..43088c5c8 Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..6f91dbf8f Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..cc48bff8c Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..73a4479e3 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..aa4d2de84 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..0e5fbfcdb Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..7c1ce4447 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..e8cdaccab Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..673cee40f Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..4816607b9 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..00540450d Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..7c1e68ea8 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..9aaa1f388 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..f85a8a3f9 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..c2a2071cf Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..127c8d843 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..235939261 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/cql_optimization.doctree b/branch-4.1/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..284af482d Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/index.doctree b/branch-4.1/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..29abdd921 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.1/.nojekyll b/branch-4.1/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.1/404.html b/branch-4.1/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.1/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                    +

                    404

                    +

                    The ScyllaDB monster ate your page!

                    +

                    + Home +

                    +
                    + + + \ No newline at end of file diff --git a/branch-4.1/CNAME b/branch-4.1/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.1/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.1/_common/monitor-description.html b/branch-4.1/_common/monitor-description.html new file mode 100644 index 000000000..a4b5bc564 --- /dev/null +++ b/branch-4.1/_common/monitor-description.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +

                    ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                    + + +
                    + + + + + +
                    + + +
                    + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.1/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.1/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.1/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.1/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.1/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..01b3668be --- /dev/null +++ b/branch-4.1/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,125 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={level=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.1/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.1/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..c566d6300 --- /dev/null +++ b/branch-4.1/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","comparator":"<=","value":0},{"palette":"white_on_green","comparator":"<=","value":3},{"palette":"white_on_red","comparator":">","value":3}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":104,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":104,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":73,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"response_format":"timeseries","style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":98,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":104,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":104,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","is_read_only":false,"notify_list":[],"id":"r42-yag-cuw"} diff --git a/branch-4.1/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.1/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..d15af0322 --- /dev/null +++ b/branch-4.1/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,123 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={level=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.1/_images/1.png b/branch-4.1/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.1/_images/1.png differ diff --git a/branch-4.1/_images/2.png b/branch-4.1/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.1/_images/2.png differ diff --git a/branch-4.1/_images/3.png b/branch-4.1/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.1/_images/3.png differ diff --git a/branch-4.1/_images/advisor_panel.png b/branch-4.1/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-4.1/_images/advisor_panel.png differ diff --git a/branch-4.1/_images/after-backfilling.jpg b/branch-4.1/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.1/_images/after-backfilling.jpg differ diff --git a/branch-4.1/_images/alertmanager.png b/branch-4.1/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.1/_images/alertmanager.png differ diff --git a/branch-4.1/_images/before-backfilling.png b/branch-4.1/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.1/_images/before-backfilling.png differ diff --git a/branch-4.1/_images/cql_optimization_master.png b/branch-4.1/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.1/_images/cql_optimization_master.png differ diff --git a/branch-4.1/_images/datadog.png b/branch-4.1/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.1/_images/datadog.png differ diff --git a/branch-4.1/_images/grafana.png b/branch-4.1/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.1/_images/grafana.png differ diff --git a/branch-4.1/_images/monitor.png b/branch-4.1/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-4.1/_images/monitor.png differ diff --git a/branch-4.1/_images/monitoring_stack.png b/branch-4.1/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.1/_images/monitoring_stack.png differ diff --git a/branch-4.1/_images/monitoring_stack1.png b/branch-4.1/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.1/_images/monitoring_stack1.png differ diff --git a/branch-4.1/_sources/_common/monitor-description.rst.txt b/branch-4.1/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.1/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.1/_sources/index.rst.txt b/branch-4.1/_sources/index.rst.txt new file mode 100644 index 000000000..97ea5ff5a --- /dev/null +++ b/branch-4.1/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on Scylla University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.1/_sources/install/docker_compose.rst.txt b/branch-4.1/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.1/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.1/_sources/install/index.rst.txt b/branch-4.1/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-4.1/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.1/_sources/install/min-prod-hw.rst.txt b/branch-4.1/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..443638374 --- /dev/null +++ b/branch-4.1/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,32 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. diff --git a/branch-4.1/_sources/install/monitor_without_docker.rst.txt b/branch-4.1/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..a53e9c6c5 --- /dev/null +++ b/branch-4.1/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,504 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories + +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.1/_sources/install/monitoring_stack.rst.txt b/branch-4.1/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..a20ec7363 --- /dev/null +++ b/branch-4.1/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,392 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API <../../reference/monitoring_apis/#prometheus>`_ + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.1/_sources/install/start_all.rst.txt b/branch-4.1/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..c2e927a99 --- /dev/null +++ b/branch-4.1/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.1/_sources/install/thanos.rst.txt b/branch-4.1/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.1/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.1/_sources/intro.rst.txt b/branch-4.1/_sources/intro.rst.txt new file mode 100644 index 000000000..67e73435b --- /dev/null +++ b/branch-4.1/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.1/_sources/procedures/alerts/alerting.rst.txt b/branch-4.1/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.1/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.1/_sources/procedures/alerts/index.rst.txt b/branch-4.1/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.1/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.1/_sources/procedures/datadog/index.rst.txt b/branch-4.1/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..d15b2c8b6 --- /dev/null +++ b/branch-4.1/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,58 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Loading Scylla dashboard to Datadog. +3. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the promemtheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.1/_sources/procedures/index.rst.txt b/branch-4.1/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..9e17f2aa1 --- /dev/null +++ b/branch-4.1/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.1/_sources/procedures/updating_dashboard.rst.txt b/branch-4.1/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.1/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.1/_sources/reference/index.rst.txt b/branch-4.1/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-4.1/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.1/_sources/reference/matrix.rst.txt b/branch-4.1/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..bca3826ef --- /dev/null +++ b/branch-4.1/_sources/reference/matrix.rst.txt @@ -0,0 +1,130 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.1/_sources/reference/monitoring_apis.rst.txt b/branch-4.1/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..ce53e9d8f --- /dev/null +++ b/branch-4.1/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring_stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.1/_sources/troubleshooting/index.rst.txt b/branch-4.1/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-4.1/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-4.1/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-4.1/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..a2e14a1f4 --- /dev/null +++ b/branch-4.1/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,221 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.1/_sources/upgrade/index.rst.txt b/branch-4.1/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..817f65247 --- /dev/null +++ b/branch-4.1/_sources/upgrade/index.rst.txt @@ -0,0 +1,42 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                    +
                    +
                    +
                    Upgrade Scylla Open Source
                    +
                    +
                    + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                    +
                    +
                    diff --git a/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..0e4fd3baa --- /dev/null +++ b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,103 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + + + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..3bb8af42b --- /dev/null +++ b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,132 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..d1974adfc --- /dev/null +++ b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,63 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..a356f5c21 --- /dev/null +++ b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,138 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..b64fd5d7e --- /dev/null +++ b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,281 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-4.1/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.1/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.1/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.1/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.1/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.1/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.1/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.1/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.1/_sources/use-monitoring/cql_optimization.rst.txt b/branch-4.1/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.1/_sources/use-monitoring/index.rst.txt b/branch-4.1/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.1/_static/basic.css b/branch-4.1/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.1/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.1/_static/check-solid.svg b/branch-4.1/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.1/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.1/_static/clipboard.min.js b/branch-4.1/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.1/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.1/_static/copybutton.css b/branch-4.1/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.1/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                    Short

                    + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.1/_static/copybutton.js b/branch-4.1/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.1/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.1/_static/copybutton_funcs.js b/branch-4.1/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.1/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.1/_static/css/main.css b/branch-4.1/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-4.1/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.1/_static/doctools.js b/branch-4.1/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.1/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.1/_static/documentation_options.js b/branch-4.1/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.1/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.1/_static/file.png b/branch-4.1/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.1/_static/file.png differ diff --git a/branch-4.1/_static/img/banner-background.svg b/branch-4.1/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.1/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.1/_static/img/favicon-228x228.png b/branch-4.1/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.1/_static/img/favicon-228x228.png differ diff --git a/branch-4.1/_static/img/favicon-32x32.png b/branch-4.1/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.1/_static/img/favicon-32x32.png differ diff --git a/branch-4.1/_static/img/favicon.ico b/branch-4.1/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.1/_static/img/favicon.ico differ diff --git a/branch-4.1/_static/img/icons/icon-about-team.svg b/branch-4.1/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.1/_static/img/icons/icon-about-us-m.svg b/branch-4.1/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-about-us.svg b/branch-4.1/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-alternator.svg b/branch-4.1/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-apps.svg b/branch-4.1/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-architecture.svg b/branch-4.1/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.1/_static/img/icons/icon-benchmarks.svg b/branch-4.1/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.1/_static/img/icons/icon-blog.svg b/branch-4.1/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.1/_static/img/icons/icon-careers.svg b/branch-4.1/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.1/_static/img/icons/icon-chevron-left.svg b/branch-4.1/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.1/_static/img/icons/icon-chevron-right.svg b/branch-4.1/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.1/_static/img/icons/icon-circe.svg b/branch-4.1/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-clock.svg b/branch-4.1/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-close.svg b/branch-4.1/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-cloud-docs.svg b/branch-4.1/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-cloud.svg b/branch-4.1/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-comparison.svg b/branch-4.1/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.1/_static/img/icons/icon-contact-us.svg b/branch-4.1/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.1/_static/img/icons/icon-developers-blog.svg b/branch-4.1/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.1/_static/img/icons/icon-docs.svg b/branch-4.1/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.1/_static/img/icons/icon-enterprise-m.svg b/branch-4.1/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-enterprise.svg b/branch-4.1/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-events.svg b/branch-4.1/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.1/_static/img/icons/icon-exclamation.svg b/branch-4.1/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-expand.svg b/branch-4.1/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-forum.svg b/branch-4.1/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-getting-started.svg b/branch-4.1/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-glossary.svg b/branch-4.1/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-home.svg b/branch-4.1/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-infoworld.svg b/branch-4.1/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.1/_static/img/icons/icon-integrations.svg b/branch-4.1/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-knowledge-base.svg b/branch-4.1/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-less.svg b/branch-4.1/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-live-test.svg b/branch-4.1/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.1/_static/img/icons/icon-mail-list.svg b/branch-4.1/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-manager.svg b/branch-4.1/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.1/_static/img/icons/icon-memory-management.svg b/branch-4.1/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.1/_static/img/icons/icon-modeling.svg b/branch-4.1/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-monitoring.svg b/branch-4.1/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.1/_static/img/icons/icon-networking.svg b/branch-4.1/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.1/_static/img/icons/icon-news.svg b/branch-4.1/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.1/_static/img/icons/icon-newsletter.svg b/branch-4.1/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.1/_static/img/icons/icon-nsql-guides.svg b/branch-4.1/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.1/_static/img/icons/icon-open-source.svg b/branch-4.1/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.1/_static/img/icons/icon-operator.svg b/branch-4.1/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-overview.svg b/branch-4.1/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.1/_static/img/icons/icon-partners.svg b/branch-4.1/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.1/_static/img/icons/icon-plus.svg b/branch-4.1/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-pricing.svg b/branch-4.1/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.1/_static/img/icons/icon-release-notes.svg b/branch-4.1/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.1/_static/img/icons/icon-resource-center.svg b/branch-4.1/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.1/_static/img/icons/icon-roadmap.svg b/branch-4.1/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.1/_static/img/icons/icon-search.svg b/branch-4.1/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.1/_static/img/icons/icon-slack.svg b/branch-4.1/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-stack-overflow.svg b/branch-4.1/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.1/_static/img/icons/icon-summit.svg b/branch-4.1/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-support.svg b/branch-4.1/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.1/_static/img/icons/icon-tech-talks.svg b/branch-4.1/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.1/_static/img/icons/icon-testing.svg b/branch-4.1/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.1/_static/img/icons/icon-thumbs-down.svg b/branch-4.1/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-thumbs-up.svg b/branch-4.1/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-tip.svg b/branch-4.1/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.1/_static/img/icons/icon-training.svg b/branch-4.1/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.1/_static/img/icons/icon-triangle-down.svg b/branch-4.1/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.1/_static/img/icons/icon-university.svg b/branch-4.1/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.1/_static/img/icons/icon-users-blog.svg b/branch-4.1/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.1/_static/img/icons/icon-warning.svg b/branch-4.1/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-webinars.svg b/branch-4.1/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.1/_static/img/icons/icon-whitepapers.svg b/branch-4.1/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.1/_static/img/icons/icon-workshop.svg b/branch-4.1/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/logo-docs.svg b/branch-4.1/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.1/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.1/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.1/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.1/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.1/_static/img/mascots/404.jpg b/branch-4.1/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.1/_static/img/mascots/404.jpg differ diff --git a/branch-4.1/_static/img/mascots/scylla-3monsters.png b/branch-4.1/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.1/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-alternator.svg b/branch-4.1/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.1/_static/img/mascots/scylla-cloud.svg b/branch-4.1/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.1/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.1/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-computer-headset.png b/branch-4.1/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-cup-number-one.png b/branch-4.1/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-docs.svg b/branch-4.1/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.1/_static/img/mascots/scylla-drivers.svg b/branch-4.1/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.1/_static/img/mascots/scylla-enterprise.svg b/branch-4.1/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.1/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.1/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-forklift-migration.png b/branch-4.1/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-gear.png b/branch-4.1/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-hardhat.png b/branch-4.1/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-headband.png b/branch-4.1/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-headset.png b/branch-4.1/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-hearts.png b/branch-4.1/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-looking-down.png b/branch-4.1/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-looking-up.png b/branch-4.1/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.1/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.1/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-manager.svg b/branch-4.1/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.1/_static/img/mascots/scylla-monitor.svg b/branch-4.1/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.1/_static/img/mascots/scylla-movement-fast.png b/branch-4.1/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-movement.png b/branch-4.1/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-onpremise.png b/branch-4.1/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-opensource.svg b/branch-4.1/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.1/_static/img/mascots/scylla-operator.svg b/branch-4.1/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.1/_static/img/mascots/scylla-plugin.png b/branch-4.1/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-release-mascot.png b/branch-4.1/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-repair.png b/branch-4.1/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-server.png b/branch-4.1/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-sleeping.png b/branch-4.1/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-tall-measure.png b/branch-4.1/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-university.png b/branch-4.1/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-weights.png b/branch-4.1/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-window-cleaning.png b/branch-4.1/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-with-computer-2.png b/branch-4.1/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-with-computer.png b/branch-4.1/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-with-linux.png b/branch-4.1/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-writting.png b/branch-4.1/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.1/_static/img/menu.svg b/branch-4.1/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.1/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.1/_static/img/scylla-monitor.png b/branch-4.1/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.1/_static/img/scylla-monitor.png differ diff --git a/branch-4.1/_static/js/main.bundle.js b/branch-4.1/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-4.1/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
                  • Back
                  • ',backButtonPosition:"top",wrapper:"
                    ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                      "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                      ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                      ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                      ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                      ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                      "],col:[2,"","
                      "],tr:[2,"","
                      "],td:[3,"","
                      "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + + + +
                      + + + + + +
                      + + +
                      + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/index.html b/branch-4.1/index.html new file mode 100644 index 000000000..3b7d0e26d --- /dev/null +++ b/branch-4.1/index.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      ScyllaDB Monitoring Stack

                      +
                      +
                      +

                      ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                      +_images/monitor.png +

                      The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                      +
                        +
                      • prometheus - collects and stores metrics

                      • +
                      • alertmanager - handles alerts

                      • +
                      • grafana - dashboard server

                      • +
                      +

                      Choose a topic to get started:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/docker_compose.html b/branch-4.1/install/docker_compose.html new file mode 100644 index 000000000..b592e0c83 --- /dev/null +++ b/branch-4.1/install/docker_compose.html @@ -0,0 +1,825 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Using Docker Compose

                      +

                      Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                      +

                      Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                      +
                      +

                      Warning

                      +

                      docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                      +
                      +
                      +

                      Prerequisite

                      +

                      Make sure you have docker and docker-compose installed.

                      +
                      +
                      +

                      Setting Prometheus

                      +

                      The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                      +

                      You can use ./prometheus-config.sh to generate the file, for example:

                      +
                      ./prometheus-config.sh --compose
                      +
                      +
                      +

                      For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                      +
                      +
                      +

                      Setting Grafana Provisioning

                      +

                      Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                      +
                      +

                      Grafana Data-Source file

                      +

                      Run the following command to update the datasource:

                      +
                      ./grafana-datasource.sh --compose
                      +
                      +
                      +

                      You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                      +
                      +
                      +

                      Grafana Dashboard Load file

                      +

                      To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                      +
                      ./generate-dashboards.sh -t -v 2020.1
                      +
                      +
                      +

                      This command generates the files under: grafana/provisioning/dashboards/

                      +
                      +
                      +
                      +

                      Docker Compose file

                      +

                      You can use the following example as a base for your docker compose.

                      +

                      Pass the following to a file called docker-compose.yml

                      +
                      services:
                      +  alertmanager:
                      +    container_name: aalert
                      +    image: prom/alertmanager:v0.21.0
                      +    ports:
                      +    - 9093:9093
                      +    volumes:
                      +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                      +  grafana:
                      +    container_name: agraf
                      +    environment:
                      +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                      +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                      +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                      +    # This is where you set Grafana security
                      +    - GF_AUTH_BASIC_ENABLED=false
                      +    - GF_AUTH_ANONYMOUS_ENABLED=true
                      +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                      +    - GF_SECURITY_ADMIN_PASSWORD=admin
                      +    image: grafana/grafana:7.3.5
                      +    ports:
                      +    - 3000:3000
                      +    user: 1000:1000
                      +    volumes:
                      +    - ./grafana/build:/var/lib/grafana/dashboards
                      +    - ./grafana/plugins:/var/lib/grafana/plugins
                      +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                      +    # Uncomment the following line for grafana persistency
                      +    # - path/to/grafana/dir:/var/lib/grafana
                      +  loki:
                      +    command:
                      +    - --config.file=/mnt/config/loki-config.yaml
                      +    container_name: loki
                      +    image: grafana/loki:2.0.0
                      +    ports:
                      +    - 3100:3100
                      +    volumes:
                      +    - ./loki/rules:/etc/loki/rules
                      +    - ./loki/conf:/mnt/config
                      +  promotheus:
                      +    command:
                      +    - --config.file=/etc/prometheus/prometheus.compose.yml
                      +    container_name: aprom
                      +    image: prom/prometheus:v2.18.1
                      +    ports:
                      +    - 9090:9090
                      +    volumes:
                      +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                      +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                      +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                      +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                      +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                      +    # Uncomment the following line for prometheus persistency 
                      +    # - path/to/data/dir:/prometheus/data
                      +  promtail:
                      +    command:
                      +    - --config.file=/etc/promtail/config.yml
                      +    container_name: promtail
                      +    image: grafana/promtail:2.0.0
                      +    ports:
                      +    - 1514:1514
                      +    - 9080:9080
                      +    volumes:
                      +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                      +version: '3'
                      +
                      +
                      +
                      +

                      Start and Stop

                      +

                      To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/index.html b/branch-4.1/install/index.html new file mode 100644 index 000000000..dc655445e --- /dev/null +++ b/branch-4.1/install/index.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Download and Install Scylla Monitoring Stack

                      +
                      +
                      +

                      Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                      +

                      Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/min-prod-hw.html b/branch-4.1/install/min-prod-hw.html new file mode 100644 index 000000000..944c678eb --- /dev/null +++ b/branch-4.1/install/min-prod-hw.html @@ -0,0 +1,715 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Minimal Production System Recommendations

                      +
                        +
                      • CPU - at least 2 physical cores/ 4vCPUs

                      • +
                      • Memory - 15GB+ DRAM and proportional to the number of cores.

                      • +
                      • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                      • +
                      • Network - 1GbE/10GbE preferred

                      • +
                      +
                      +

                      Calculating Prometheus Minimal Disk Space requirement

                      +

                      Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                      +

                      Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                      +

                      For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                      +
                      6 * 16 * 15 * 12MB ~ 16GB
                      +
                      +
                      +

                      To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                      +
                      +
                      +

                      Calculating Prometheus Minimal Memory Space requirement

                      +

                      Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                      +

                      For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/monitor_without_docker.html b/branch-4.1/install/monitor_without_docker.html new file mode 100644 index 000000000..0aab16266 --- /dev/null +++ b/branch-4.1/install/monitor_without_docker.html @@ -0,0 +1,1132 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Deploying Scylla Monitoring Stack Without Docker

                      +
                      +

                      Introduction

                      +

                      The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                      +

                      Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                      +

                      Scylla Monitoring uses the following components:

                      +
                        +
                      • Alertmanager

                      • +
                      • Grafana Loki

                      • +
                      • Prometheus

                      • +
                      • Grafana

                      • +
                      +

                      The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                      +

                      We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                      +
                      +
                      +

                      Minimal Production System Recommendations

                      +
                        +
                      • CPU - at least 2 physical cores/ 4vCPUs

                      • +
                      • Memory - 15GB+ DRAM and proportional to the number of cores.

                      • +
                      • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                      • +
                      • Network - 1GbE/10GbE preferred

                      • +
                      +
                      +

                      Calculating Prometheus Minimal Disk Space requirement

                      +

                      Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                      +

                      Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                      +

                      For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                      +
                      6 * 16 * 15 * 12MB ~ 16GB
                      +
                      +
                      +

                      To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                      +
                      +
                      +

                      Calculating Prometheus Minimal Memory Space requirement

                      +

                      Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                      +

                      For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                      +

                      The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                      +
                      +

                      Note

                      +

                      Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                      +
                      +
                      +
                      +
                      +

                      Install Scylla Monitoring Stack

                      +

                      The following procedure uses a CentOS 7 based instance

                      +
                        +
                      1. Download the latest Scylla Monitoring Stack release.

                      2. +
                      +
                      wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.1.0.tar.gz
                      +
                      +
                      +
                        +
                      1. Open the tar

                      2. +
                      +

                      tar -xvf scylla-monitoring-*.tar.gz

                      +
                      +
                      +

                      Install Alertmanager

                      +

                      Tested with alertmanager 0.22.2 version

                      +
                        +
                      1. Install alertmanager

                      2. +
                      +
                      wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                      +tar -xvf alertmanager-*.linux-amd64.tar.gz
                      +
                      +
                      +
                        +
                      1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                      2. +
                      +

                      For example:

                      +
                      cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.1.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                      +
                      +
                      +
                        +
                      1. Start the Alertmanager

                      2. +
                      +

                      For example:

                      +
                      cd alertmanager-0.22.2.linux-amd64
                      +./alertmanager
                      +
                      +
                      +
                        +
                      1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                      2. +
                      +

                      For example:

                      +
                      http://192.168.135.166:9093/
                      +
                      +
                      +../_images/alertmanager.png +
                      +
                      +

                      Install Grafana Loki

                      +

                      Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                      +

                      We recomand using Loki with containers, but you can install it locally as described in Loki installation

                      +

                      You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                      +

                      Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                      +

                      Loki Related files

                      +

                      Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                      +
                      mkdir -p /etc/loki/rules
                      +mkdir -p /etc/loki/config
                      +cp loki/rules/* /etc/loki/rules
                      +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                      +
                      +
                      +

                      Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                      +

                      Promtail Related files

                      +

                      Promtail has a configuration file. You need to copy and modify the configuration.

                      +
                      mkdir -p /etc/promtail/
                      +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                      +
                      +
                      +

                      Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                      +
                      +
                      +

                      Install Prometheus

                      +

                      Tested with Prometheus version 2.27.1

                      +
                      +

                      Note

                      +

                      If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                      +
                      +
                        +
                      1. Install Prometheus

                      2. +
                      +
                      wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                      +tar -xvf prometheus-*.linux-amd64.tar.gz
                      +
                      +
                      +
                        +
                      1. Create Data and Config directories

                      2. +
                      +
                      mkdir -p /prometheus/data
                      +mkdir -p /etc/prometheus/prom_rules/
                      +mkdir -p /etc/scylla.d/prometheus/
                      +
                      +
                      +
                        +
                      1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                      2. +
                      +

                      Copy prometheus/prometheus.yml.template to prometheus.yml

                      +

                      For example:

                      +
                      cp scylla-monitoring-scylla-monitoring-4.1.0/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                      +cp scylla-monitoring-scylla-monitoring-4.1.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                      +
                      +
                      +
                        +
                      1. Edit the prometheus.yml file to point to the correct static data sources.

                      2. +
                      +
                      +

                      Note

                      +

                      Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                      +
                      +
                      vi /etc/prometheus/prometheus.yml
                      +
                      +
                      +

                      Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                      +

                      For example if the alertmanager will run on the same host:

                      +
                      alerting:
                      +   alertmanagers:
                      +   - static_configs:
                      +       - targets:
                      +           - 127.0.0.1:9093
                      +
                      +
                      +

                      Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                      +

                      For example the scrape config for Scylla:

                      +
                      global:
                      +  scrape_interval: 5s # By default, scrape targets every 5 second.
                      +  scrape_timeout: 4s # Timeout before trying to scape a target again
                      +
                      +  # Attach these labels to any time series or alerts when communicating with
                      +  # external systems (federation, remote storage, Alertmanager).
                      +  external_labels:
                      +    monitor: 'scylla-monitor'
                      +
                      +scrape_configs:
                      +- job_name: scylla
                      +  honor_labels: false
                      +  file_sd_configs:
                      +    - files:
                      +      - /etc/scylla.d/prometheus/scylla_servers.yml
                      +  relabel_configs:
                      +    - source_labels: [__address__]
                      +      regex:  '([^:]+)'
                      +      target_label: __address__
                      +      replacement: '${1}:9180'
                      +
                      +    - source_labels: [__address__]
                      +      regex:  '(.*):.+'
                      +      target_label: instance
                      +      replacement: '${1}'
                      +
                      +
                      +
                        +
                      1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                      2. +
                      +
                      +

                      Note

                      +

                      There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                      +
                      +

                      An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                      +
                      +

                      Note

                      +

                      You must have both files even if you are not using Scylla Manager

                      +
                      +

                      Add the labels for the cluster and data-center

                      +

                      scylla_servers.yml:

                      +

                      For example:

                      +
                      cat scylla_servers.yml
                      +# List Scylla end points
                      +
                      +- targets:
                      +  - 192.168.66.6
                      +  - 192.168.66.244
                      +  labels:
                      +    cluster: cluster1
                      +    dc: dc1
                      +- targets:
                      +    - 172.17.0.3
                      +  labels:
                      +    cluster: cluster1
                      +    dc: dc2
                      +
                      +
                      +
                      +

                      Note

                      +

                      See the previous note about deprecating the node_exporter_servers.yml file.

                      +
                      +

                      scylla_manager_server.yml

                      +

                      For example:

                      +
                      - targets:
                      +  - 127.0.0.1:5090
                      +
                      +
                      +
                        +
                      1. Start Prometheus server:

                      2. +
                      +

                      For example:

                      +
                      cd scylla-monitoring-scylla-monitoring-4.1.0/
                      +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                      +
                      +
                      +

                      Data should start accumulate on: /prometheus/data

                      +
                        +
                      1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                      2. +
                      +

                      For example:

                      +
                      http://192.168.135.166:9090/
                      +
                      +
                      +../_images/1.png +

                      Prometheus console should be visible

                      +
                        +
                      1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                      2. +
                      +

                      For example:

                      +

                      node_memory_MemFree

                      +../_images/2.png +

                      And

                      +

                      scylla_reactor_utilization

                      +../_images/3.png +

                      At this point Scylla is emitting the metrics and Prometheus is able to store them.

                      +
                      +
                      +

                      Install Grafana

                      +

                      Tested with Grafna 7.5.7

                      +
                        +
                      1. Install Grafana based on the instructions here

                      2. +
                      +

                      Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                      +
                        +
                      1. Access Scylla-Grafana-monitoring directory

                      2. +
                      +
                      cd scylla-monitoring-scylla-monitoring-4.1.0/
                      +
                      +
                      +
                        +
                      1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                      2. +
                      +
                      sudo cp -r grafana/plugins /var/lib/grafana/
                      +
                      +
                      +

                      If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                      +

                      For example:

                      +
                      cp -r grafana/plugins ../grafana-7.5.7/public/app
                      +
                      +
                      +
                        +
                      1. Provision the Dashboards

                      2. +
                      +

                      For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                      +

                      For Grafana installed with yum install

                      +
                      sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                      +sudo mkdir -p /var/lib/grafana/dashboards
                      +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                      +
                      +
                      +

                      For Grafana installed from packages

                      +
                      cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                      +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                      +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                      +
                      +
                      +

                      Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                      +
                      +

                      Note

                      +

                      A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                      +
                      +
                        +
                      1. Set the data source by copy datasource.yml and edit it

                      2. +
                      +
                      sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                      +
                      +
                      +
                      +

                      Note

                      +

                      Scylla uses a plugin to read from some system tables see the section below about using it.

                      +
                      +

                      For Grafana installed from packages

                      +
                      cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                      +
                      +
                      +

                      You should set the Prometheus and the alertmanager IP and port.

                      +

                      For example

                      +
                      sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                      +apiVersion: 1
                      +datasources:
                      + - name: prometheus
                      +   type: prometheus
                      +   url: http://192.168.135.167:9090
                      +   access: proxy
                      +   basicAuth: false
                      +
                      + - name: alertmanager
                      +   type: camptocamp-prometheus-alertmanager-datasource
                      +   orgId: 1
                      +   typeLogoUrl: public/img/icn-datasource.svg
                      +   access: proxy
                      +   url: http://192.168.135.166:9093
                      +   password:
                      +   user:
                      +   database:
                      +   basicAuth:
                      +   isDefault:
                      +   jsonData:
                      +     severity_critical: '4'
                      +     severity_high: '3'
                      +     severity_warning: '2'
                      +     severity_info: '1'
                      +
                      +
                      +
                        +
                      1. Start the Grafana service

                      2. +
                      +

                      For Grafana installed with yum install

                      +

                      sudo service grafana-server start

                      +

                      For Grafana installed from packages:

                      +

                      cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                      +

                      Edit scylla.ini to reflect the right paths in the paths section of the file.

                      +
                      plugins = /home/centos/grafana-7.5.7/data/plugins
                      +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                      +
                      +
                      +

                      Start the server:

                      +
                      cd /home/centos/grafana-7.5.7/
                      +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                      +
                      +
                      +
                        +
                      1. Make sure Grafana is running

                      2. +
                      +

                      Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                      +../_images/grafana.png +
                      +
                      +

                      Using Scylla Plugin with Grafana

                      +

                      Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                      +

                      Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                      +
                      +

                      Setting a monitoring user

                      +

                      This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                      +
                        +
                      • If you have not done so, enable authorization first.

                      • +
                      • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                      • +
                      • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                      • +
                      +
                      +
                      +

                      Installing the Plugin

                      +

                      Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                      +
                      +
                      +

                      Configure the Plugin

                      +

                      Add an entry to the datasource.yml file

                      +
                      - name: scylla-datasource
                      +  type: scylladb-scylla-datasource
                      +  orgId: 1
                      +  isDefault:
                      +  jsonData:
                      +  host: ''
                      +#  secureJsonData:
                      +#    user: 'scylla_monitoring'
                      +#    password: 'scylla_monitoring'
                      +
                      +
                      +

                      As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                      +
                      +
                      +

                      Enable the Plugin

                      +

                      Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                      +

                      See more about it the Grafana configurtion.

                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/monitoring_stack.html b/branch-4.1/install/monitoring_stack.html new file mode 100644 index 000000000..5d24ba827 --- /dev/null +++ b/branch-4.1/install/monitoring_stack.html @@ -0,0 +1,1053 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Install Scylla Monitoring Stack

                      +

                      This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API

                      +

                      The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                      +

                      For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                      +
                      +

                      Minimal Production System Recommendations

                      +
                        +
                      • CPU - at least 2 physical cores/ 4vCPUs

                      • +
                      • Memory - 15GB+ DRAM and proportional to the number of cores.

                      • +
                      • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                      • +
                      • Network - 1GbE/10GbE preferred

                      • +
                      +
                      +

                      Calculating Prometheus Minimal Disk Space requirement

                      +

                      Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                      +

                      Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                      +

                      For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                      +
                      6 * 16 * 15 * 12MB ~ 16GB
                      +
                      +
                      +

                      To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                      +
                      +
                      +

                      Calculating Prometheus Minimal Memory Space requirement

                      +

                      Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                      +

                      For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                      +
                      +
                      +
                      +

                      Prerequisites

                      +
                        +
                      • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                      • +
                      • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                      • +
                      + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      Scylla Monitoring Stack Compatibility Matrix

                      Scylla Monitoring Stack Version

                      Prometheus Version

                      Grafana Version

                      4.1

                      2.38.0

                      9.1.0

                      4.0

                      2.34.0

                      8.5.2

                      3.11

                      2.32.0

                      8.3.4

                      3.10

                      2.32.0

                      8.3.3

                      3.9.2

                      2.29.1

                      8.2.7

                      3.9

                      2.29.1

                      8.1.1

                      3.8

                      2.27.1

                      7.5.7

                      3.7

                      2.25.2

                      7.4.0

                      3.6

                      2.18.1

                      7.3.5

                      3.5

                      2.18.1

                      7.1.5

                      3.4

                      2.18.1

                      6.7.3

                      +
                      +
                      +

                      Docker Post Installation

                      +

                      Docker post installation guide can be found here

                      +
                      +

                      Note

                      +

                      Avoid running the container as root.

                      +
                      +

                      To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                      +
                        +
                      1. Create the Docker group.

                      2. +
                      +
                      sudo groupadd docker
                      +
                      +
                      +
                        +
                      1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                      2. +
                      +
                      sudo usermod -aG docker $USER
                      +
                      +
                      +
                        +
                      1. Start Docker by calling:

                      2. +
                      +
                      sudo systemctl enable docker
                      +
                      +
                      +
                      +
                      +

                      Install Scylla Monitoring Stack

                      +

                      Procedure

                      +
                        +
                      1. Download and extract the latest Scylla Monitoring Stack binary;.

                      2. +
                      +
                      wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.1.0.tar.gz
                      +tar -xvf scylla-monitoring-4.1.0.tar.gz
                      +cd scylla-monitoring-scylla-monitoring-4.1.0
                      +
                      +
                      +

                      As an alternative, you can clone and use the Git repository directly.

                      +
                      git clone https://github.com/scylladb/scylla-monitoring.git
                      +cd scylla-monitoring
                      +git checkout branch-4.1
                      +
                      +
                      +
                        +
                      1. Start Docker service if needed

                      2. +
                      +
                      sudo systemctl restart docker
                      +
                      +
                      +
                      +
                      +

                      Configure Scylla Monitoring Stack

                      +

                      To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                      +

                      This configuration can be done from files, or using the Consul api.

                      +

                      Scylla Manager 2.0 and higher supports the Consul API.

                      +
                      +

                      Configure Scylla nodes from files

                      +
                        +
                      1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                      2. +
                      +
                      +

                      Note

                      +

                      It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                      +
                      +

                      For example:

                      +
                      - targets:
                      +      - 172.17.0.2
                      +      - 172.17.0.3
                      +  labels:
                      +      cluster: cluster1
                      +      dc: dc1
                      +
                      +
                      +
                      +

                      Note

                      +

                      If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                      +
                      +

                      Using IPV6

                      +

                      To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                      +

                      For example:

                      +
                      - targets:
                      +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                      +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                      +  labels:
                      +      cluster: cluster1
                      +      dc: dc1
                      +
                      +
                      +
                      +

                      Note

                      +

                      For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                      +
                      +

                      For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                      +
                      +

                      Note

                      +

                      By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                      +
                      +

                      If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                      +

                      For example:

                      +
                      ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                      +
                      +
                      +

                      Mark the different Data Centers with Labels.

                      +

                      As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                      +

                      You can use the genconfig.py script to generate the server file. For example:

                      +
                      ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                      +
                      +
                      +

                      This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                      +

                      OR

                      +

                      The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                      +
                      nodetool status | ./genconfig.py -NS
                      +
                      +
                      +

                      2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                      +

                      You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                      +

                      For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                      +
                      # List Scylla Manager end points
                      +
                      +- targets:
                      +  - 172.17.0.7:5090
                      +
                      +
                      +

                      Note that you do not need to add labels to the Scylla Manager targets.

                      +
                      +
                      +

                      Configure Scylla nodes using Scylla-Manager Consul API

                      +

                      Scylla Manager 2.0 has a Consul like API.

                      +

                      When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                      +

                      For example:

                      +
                      ./start-all.sh -L 10.10.0.1
                      +
                      +
                      +
                      +

                      Note

                      +

                      If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                      +
                      +
                      +
                      +

                      Connecting Scylla-Monitoring to Scylla

                      +

                      Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                      +

                      You can limit the user to read only, currently it only read table from the system keyspace.

                      +

                      To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

                      +

                      Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

                      +
                      +
                      +

                      Use an external directory for the Prometheus data directory

                      +

                      The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                      +
                      +

                      Note

                      +

                      Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                      +
                      +

                      If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                      +

                      In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                      +
                      +
                      +

                      Add Additional Prometheus Targets

                      +

                      There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                      +

                      The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                      +

                      You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                      +
                      - job_name: 'myservice'
                      +  # Override the global default and scrape targets from this job every 5 seconds.
                      +  scrape_interval: 5s
                      +  static_configs:
                      +    - targets:
                      +      - 17.0.0.1:7000
                      +
                      +
                      +
                      +
                      +
                      +

                      Start and Stop Scylla Monitoring Stack

                      +
                      +

                      Start

                      +
                      ./start-all.sh -d prometheus_data
                      +
                      +
                      +
                      +
                      +

                      Stop

                      +
                      ./kill-all.sh
                      +
                      +
                      +
                      +
                      +

                      Start a Specific Scylla Monitoring Stack Version

                      +

                      By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                      +

                      You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                      +

                      Multiple versions are supported. For example:

                      +
                      ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                      +
                      +
                      +

                      will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                      +
                      +
                      +

                      Accessing the localhost

                      +

                      The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                      +
                      ./start-all.sh -l -d prometheus-data
                      +
                      +
                      +
                      +
                      +

                      Configure rsyslog on each Scylla node

                      +

                      generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                      +

                      Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                      +

                      Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                      +

                      If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                      +
                      if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                      +
                      +
                      +

                      Restart rsyslog for the configuration to take effect.

                      +
                      systemctl restart rsyslog
                      +
                      +
                      +
                      +
                      +
                      +

                      View Grafana Dashboards

                      +

                      Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/start_all.html b/branch-4.1/install/start_all.html new file mode 100644 index 000000000..89cfda0e0 --- /dev/null +++ b/branch-4.1/install/start_all.html @@ -0,0 +1,765 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      The start-all.sh Command

                      +

                      Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                      +

                      The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                      +
                      +

                      General Options

                      +

                      -h Help, Print the help, and exit.

                      +

                      –version print the current Scylla-Monitoring stack version, and exit.

                      +

                      -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                      +

                      -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                      +

                      -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                      +

                      –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                      +
                      + + +
                      +

                      Alert Manager

                      +

                      The Alertmanager handles the alerts and takes the following parameters:

                      +

                      -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                      +

                      -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                      +

                      -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/thanos.html b/branch-4.1/install/thanos.html new file mode 100644 index 000000000..5eb669f40 --- /dev/null +++ b/branch-4.1/install/thanos.html @@ -0,0 +1,768 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Using Thanos as Data Source With Scylla Monitoring Stack

                      +

                      Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                      +
                        +
                      • High-availability.

                      • +
                      • Horizontal scaling.

                      • +
                      • Backup.

                      • +
                      +

                      The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                      +

                      The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                      +
                      +

                      Using Thanos As a Prometheus Aggregator

                      +

                      There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                      +
                      +

                      Prometheus Configuration

                      +

                      We will assume you have two Prometheus servers running.

                      +
                        +
                      1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                      2. +
                      3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                      4. +
                      +
                      +
                      +

                      Thanos sidecar

                      +

                      The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                      +
                      docker run -d \
                      + -v /path/to/prom/dir:/data/prom:z \
                      + -i --name sidecar thanosio/thanos \
                      + sidecar \
                      + --grpc-address=0.0.0.0:10911 \
                      + --grpc-grace-period=1s \
                      + --http-address=0.0.0.0:10912 \
                      + --http-grace-period=1s \
                      + --prometheus.url=http://prometheus-ip:9090 \
                      + --tsdb.path=/data/prom \
                      + -p 10912:10912 \
                      + -p 10911:10911
                      +
                      +
                      +

                      After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                      +
                      +
                      +

                      Thanos query

                      +

                      Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                      +
                      docker run -d \
                      + --name thanos -- thanosio/thanos \
                      +   query \
                      +   --debug.name=query0 \
                      +   --log.level=debug \
                      +   --grpc-address=0.0.0.0:10903 \
                      +   --grpc-grace-period=1s \
                      +   --http-address=0.0.0.0:10904 \
                      +   --http-grace-period=1s \
                      +   --query.replica-label=prometheus \
                      +   --store={ip1}:10911 --store={ip2}:10911
                      +
                      +
                      +

                      After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                      +
                      +
                      +

                      Update Scylla Data source

                      +

                      The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                      +

                      The file you edit is a template file that replaces the file Grafana uses, next time you start.

                      +

                      Restart the Scylla Monitoring Stack it should now use Thanos.

                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/intro.html b/branch-4.1/intro.html new file mode 100644 index 000000000..3ff251098 --- /dev/null +++ b/branch-4.1/intro.html @@ -0,0 +1,717 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      ScyllaDB Monitoring Stack

                      +

                      ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                      +_images/monitor.png +

                      The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                      +
                        +
                      • prometheus - Collects and stores metrics

                      • +
                      • grafan-loki - Parses logs and generates metrics and alerts

                      • +
                      • alertmanager - Handles alerts

                      • +
                      • grafana - Dashboards server

                      • +
                      +

                      A few optional components are used for additional services

                      +
                        +
                      • grafana-image-renderer - Allows you to download a dashboard as an image.

                      • +
                      • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                      • +
                      +
                      +

                      High Level Architecture

                      +_images/monitoring_stack1.png +

                      We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                      +

                      We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                      +

                      The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                      +

                      We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                      +

                      Choose a topic to get started:

                      + +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/objects.inv b/branch-4.1/objects.inv new file mode 100644 index 000000000..4824b5791 Binary files /dev/null and b/branch-4.1/objects.inv differ diff --git a/branch-4.1/procedures/alerts/alerting.html b/branch-4.1/procedures/alerts/alerting.html new file mode 100644 index 000000000..1880488bf --- /dev/null +++ b/branch-4.1/procedures/alerts/alerting.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Alerting

                      +

                      Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                      +

                      You can read more about Prometheus alerting here

                      +

                      By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                      +

                      In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                      +

                      The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                      +../../_images/monitoring_stack.png +
                      +

                      Prometheus Alerts

                      +

                      The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                      +

                      Each alert consists of:

                      +
                        +
                      • Name

                      • +
                      • What happened

                      • +
                      • For how long

                      • +
                      • What to report

                      • +
                      +

                      For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                      +
                      - alert: InstanceDown
                      +  expr: up == 0
                      +  for: 60s
                      +  labels:
                      +    severity: "2"
                      +  annotations:
                      +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                      +    summary: Instance {{ $labels.instance }} down
                      +
                      +
                      +

                      The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                      +

                      The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                      +

                      The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                      +

                      annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                      +
                      +
                      +

                      Alertmanager

                      +

                      The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                      +

                      The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                      +
                        +
                      • Routes: Represent a routing tree, the most specific rule, wins

                      • +
                      • Inhibition: Mute an alert, based on another alert

                      • +
                      • Receiver: Send a notification via email, sluck, etc’

                      • +
                      +

                      Check the Alertmanager documentation for details on how to specify a specific receiver.

                      +

                      In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                      +
                      +
                      +

                      Tips When Adding an Alert

                      +

                      It’s worse having an alert that does not work, than not having an alert at all

                      +

                      There are multiple ways you can use to make sure your alert is set correctly:

                      +
                        +
                      • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                      • +
                      • Force the alert to be active by reducing the limits or the duration.

                      • +
                      • When possible simulate the actual scenario and see that the alert works as expected.

                      • +
                      +

                      For example, low available disk space.

                      +

                      Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                      +

                      Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                      +

                      Starting with a simple working expression helps you bisect problems.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/procedures/alerts/index.html b/branch-4.1/procedures/alerts/index.html new file mode 100644 index 000000000..523915e17 --- /dev/null +++ b/branch-4.1/procedures/alerts/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Stack Alert Manager

                      +
                      +
                      +

                      Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/procedures/datadog/index.html b/branch-4.1/procedures/datadog/index.html new file mode 100644 index 000000000..60cab9ed3 --- /dev/null +++ b/branch-4.1/procedures/datadog/index.html @@ -0,0 +1,749 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Datadog Integration

                      +

                      The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                      +
                        +
                      1. Installing and configuring the Datadog Agent.

                      2. +
                      3. Loading Scylla dashboard to Datadog.

                      4. +
                      5. Optionally load Monitor (Alerts).

                      6. +
                      +
                      +

                      Note

                      +

                      Scylla Cloud users, use and update the proper configuration file.

                      +
                      +
                      +

                      Install And configure the Datadog Agent

                      +

                      Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                      +

                      Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                      +
                      +

                      Scylla Cloud Users

                      +

                      Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                      +

                      Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                      +
                      +
                      +

                      Other Scylla Users

                      +

                      Other Scylla users, download the configuration file conf.yaml and replace the ip address of the promemtheus server.

                      +
                      +
                      +

                      Post configuration

                      +

                      Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                      +
                      +
                      +
                      +

                      Upload the Dashboard

                      +

                      Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                      +
                      +
                      +

                      Using the Dashboard

                      +

                      We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                      +../../_images/datadog.png +

                      The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                      +
                      +

                      Note

                      +

                      Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                      +
                      +
                      +
                      +

                      Adding Monitor

                      +

                      Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/procedures/index.html b/branch-4.1/procedures/index.html new file mode 100644 index 000000000..b9a1c54c2 --- /dev/null +++ b/branch-4.1/procedures/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      ScyllaDB Monitoring Stack Procedures

                      +
                      +
                      +

                      There are several reference guides available which give additional information. Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/procedures/updating_dashboard.html b/branch-4.1/procedures/updating_dashboard.html new file mode 100644 index 000000000..1df084ef7 --- /dev/null +++ b/branch-4.1/procedures/updating_dashboard.html @@ -0,0 +1,973 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Adding and Modifying Dashboards

                      +

                      This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                      +

                      It covers dashboard templates and how to modify them.

                      + +
                      +

                      General Limitations

                      +

                      Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                      +
                      +

                      Consistency Between Restarts

                      +

                      By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                      +
                      +
                      +

                      Consistency Between Upgrades

                      +

                      As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                      +
                      +

                      Note

                      +

                       You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                      +
                      +

                      At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                      +
                      +
                      +
                      +

                      Using Templated Dashboards

                      +

                      Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                      +

                      Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                      +

                      For example a typical graph panel would look like this:

                      +
                      {
                      +    "aliasColors": {},
                      +    "bars": false,
                      +    "datasource": "prometheus",
                      +    "editable": true,
                      +    "error": false,
                      +    "fill": 0,
                      +    "grid": {
                      +        "threshold1": null,
                      +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                      +        "threshold2": null,
                      +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                      +    },
                      +    "gridPos": {
                      +        "h": 6,
                      +        "w": 10,
                      +        "x": 0,
                      +        "y": 4
                      +    },
                      +    "id": 2,
                      +    "isNew": true,
                      +    "legend": {
                      +        "avg": false,
                      +        "current": false,
                      +        "max": false,
                      +        "min": false,
                      +        "show": false,
                      +        "total": false,
                      +        "values": false
                      +    },
                      +    "lines": true,
                      +    "linewidth": 2,
                      +    "links": [],
                      +    "nullPointMode": "connected",
                      +    "percentage": false,
                      +    "pointradius": 5,
                      +    "points": false,
                      +    "renderer": "flot",
                      +    "seriesOverrides": [
                      +        {}
                      +    ],
                      +    "span": 5,
                      +    "stack": false,
                      +    "steppedLine": false,
                      +    "targets": [
                      +        {
                      +            "expr": "sum(node_filesystem_avail) by (instance)",
                      +            "intervalFactor": 1,
                      +            "legendFormat": "",
                      +            "refId": "A",
                      +            "step": 1
                      +        }
                      +    ],
                      +    "timeFrom": null,
                      +    "timeShift": null,
                      +    "title": "Available Disk Size",
                      +    "tooltip": {
                      +        "msResolution": false,
                      +        "shared": true,
                      +        "sort": 0,
                      +        "value_type": "cumulative"
                      +    },
                      +    "transparent": false,
                      +    "type": "graph",
                      +    "xaxis": {
                      +        "show": true
                      +    },
                      +    "yaxes": [
                      +        {
                      +            "format": "percent",
                      +            "logBase": 1,
                      +            "max": 101,
                      +            "min": 0,
                      +            "show": true
                      +        },
                      +        {
                      +            "format": "short",
                      +            "logBase": 1,
                      +            "max": null,
                      +            "min": null,
                      +            "show": true
                      +        }
                      +    ]
                      +}
                      +
                      +
                      +

                      As you can imagine, most panels would have similar values.

                      +

                      To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                      +
                      +

                      The Template Class System

                      +

                      The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                      +

                      The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                      +

                      In the template file, you can also add or override attributes.

                      +

                      The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                      +

                      When generating dashboards, each class will be replaced by its definition.

                      +

                      For example, a row in the type.json is defined as:

                      +
                      {
                      + "base_row": {
                      +     "collapse": false,
                      +     "editable": true
                      + },
                      + "row": {
                      +     "class": "base_row",
                      +     "height": "250px"
                      + }
                      + }
                      +
                      +
                      +

                      Will be used like in a template:

                      +
                      {
                      +     "class": "row",
                      +     "height": "150px",
                      +     "panels": [
                      +     ]
                      +}
                      +
                      +
                      +

                      And the output will be:

                      +
                      {
                      +     "class": "row",
                      +     "collapse": false,
                      +     "editable": true,
                      +     "height": "150px",
                      +     "panels": [
                      +
                      +     ]
                      +}
                      +
                      +
                      +

                      We can see that the template added the panels attribute and that it overrides the height attribute.

                      +
                      +
                      +

                      Panel Example

                      +

                      Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                      +
                      {
                      +     "class": "row",
                      +     "panels": [
                      +         {
                      +             "class": "bytes_panel",
                      +             "span": 3,
                      +             "targets": [
                      +                 {
                      +                     "expr": "sum(node_filesystem_avail) by (instance)",
                      +                     "intervalFactor": 1,
                      +                     "legendFormat": "",
                      +                     "metric": "",
                      +                     "refId": "A",
                      +                     "step": 1
                      +                 }
                      +             ],
                      +             "title": "Available Disk Size"
                      +         }
                      +     ]
                      +}
                      +
                      +
                      +

                      In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                      +

                      You can also see that the span attribute is overridden to set the panel size.

                      +

                      To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                      +
                      +
                      +

                      Grafana Formats and Layouts

                      +

                      The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                      +

                      Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                      +

                      The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                      +

                      To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                      +

                      The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                      +

                      You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                      +

                      gridPos has the following attributes:

                      +
                      {
                      +   "x": 0,
                      +   "y": 0,
                      +   "w": 24,
                      +   "h": 4
                      + }
                      +
                      +
                      +

                      When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                      +
                      {
                      +   "gridPos": {
                      +      "h": 2
                      +    }
                      +}
                      +
                      +
                      +
                      +
                      +

                      Generating the dashboards from templates (generate-dashboards.sh)

                      +
                      +

                      Prerequisite

                      +

                      Python 2.7

                      +

                      make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                      +

                      Use the -h flag to get help information.

                      +

                      You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                      +

                      When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                      +

                      For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                      +

                      .\generate-dashboards.sh -v 2020.1

                      +
                      +

                      Note

                      +

                      generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                      +
                      +
                      +
                      +
                      +

                      Validation

                      +

                      After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                      +

                      Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/reference/index.html b/branch-4.1/reference/index.html new file mode 100644 index 000000000..8969a9e4f --- /dev/null +++ b/branch-4.1/reference/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Stack Reference Guide

                      +
                      +
                      +

                      There are several reference guides available which give additional information. Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/reference/matrix.html b/branch-4.1/reference/matrix.html new file mode 100644 index 000000000..dacb43757 --- /dev/null +++ b/branch-4.1/reference/matrix.html @@ -0,0 +1,833 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Stack Support Matrix

                      +

                      The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                      + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                      Scylla Monitoring Stack Version

                      Scylla Open Source Version

                      Scylla Enterprise Version

                      Node_exporter[1] Version

                      Scylla Manager Version

                      4.1

                      4.5,4.6,5.0,5.1

                      2020.1, 2021.1, 2022.1, 2022.2

                      0.17

                      2.5, 2.6, 3.0

                      4.0

                      4.3, 4.4, 4.5, 4.6, 5.0

                      2020.1, 2021.1, 2022.1

                      0.17

                      2.3, 2.4, 2.5, 2.6, 3.0

                      3.11

                      4.3, 4.4, 4.5, 4.6, 5.0

                      2020.1, 2021.1, 2022.2

                      0.17

                      2.3, 2.4, 2.5, 2.6

                      3.10

                      4.3, 4.4, 4.5, 4.6

                      2020.1, 2021.1

                      0.17

                      2.3, 2.4, 2.5, 2.6

                      3.9

                      4.3, 4.4, 4.5, 4.6

                      2020.1, 2021.1

                      0.17

                      2.3, 2.4, 2.5

                      3.8

                      4.3, 4.4, 4.5

                      2020.1, 2021.1

                      0.17

                      2.3, 2.4, 2.5

                      3.7

                      4.2, 4.3, 4.4

                      2019.1, 2020.1, 2021.1

                      0.17

                      2.2, 2.3

                      3.6.3

                      4.2, 4.3, 4.4

                      2019.1, 2020.1, 2021.1

                      0.17

                      2.2, 2.3, 2.1

                      3.6

                      4.1, 4.2, 4.3

                      2019.1, 2020.1

                      0.17

                      2.1, 2.2, 2.3

                      3.6.1

                      4.1, 4.2, 4.3

                      2019.1, 2020.1

                      0.17

                      2.1, 2.2

                      3.6.1

                      4.1, 4.2, 4.3, 4.4

                      2019.1, 2020.1

                      0.17

                      2.1, 2.2

                      3.5

                      3.3, 4.0, 4.1, 4.2

                      2019.1, 2020.1

                      0.17

                      2.0, 2.1, 2.2

                      3.4.3

                      3.3, 4.0, 4.1, 4.2

                      2019.1, 2020.1

                      0.17

                      2.0, 2.1

                      3.4

                      3.3, 4.0, 4.1

                      2018.1, 2019.1

                      0.17

                      2.0, 2.1

                      3.3

                      3.1, 3.2, 3.3, 4.0

                      2018.1, 2019.1

                      0.17

                      1.4, 2.0, 2.1

                      3.2

                      3.1, 3.2, 3.3

                      2018.1, 2019.1

                      0.17

                      1.4, 2.0

                      3.1

                      2.3, 3.0, 3.1, 3.2

                      2018.1, 2019.1

                      0.17

                      1.3, 1.4, 2.0

                      3.0

                      2.3, 3.0, 3.1, 3.2

                      2018.1, 2019.1

                      0.17

                      1.3, 1.4

                      2.4

                      2.3, 3.0, 3.1

                      2018.1, 2019.1

                      0.14, 0.17

                      1.3, 1.4

                      2.3

                      2.3, 3.0

                      2018.1, 2019.1

                      0.14, 0.17

                      1.3

                      2.2

                      2.3, 3.0

                      2018.1, 2019.1

                      0.14, 0.17

                      1.3

                      2.1

                      2.3, 3.0

                      2018.1

                      0.14, 0.17

                      1.3

                      +

                      [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/reference/monitoring_apis.html b/branch-4.1/reference/monitoring_apis.html new file mode 100644 index 000000000..c1f33bdb8 --- /dev/null +++ b/branch-4.1/reference/monitoring_apis.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Stack Interfaces

                      +

                      Scylla exposes two interfaces for online monitoring, as described below

                      +
                      +

                      Prometheus

                      +

                      By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                      +

                      For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                      +

                      You can change the Prometheus listening address and port in scylla.yaml file

                      +
                      # prometheus port
                      +# By default, Scylla opens prometheus API port on port 9180
                      +# setting the port to 0 will disable the prometheus API.
                      +prometheus_port: 9180
                      +#
                      +# prometheus address
                      +# By default, Scylla binds all interfaces to the prometheus API
                      +# It is possible to restrict the listening address to a specific one
                      +prometheus_address: 0.0.0.0
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/robots.txt b/branch-4.1/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.1/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.1/search.html b/branch-4.1/search.html new file mode 100644 index 000000000..bb756d5b5 --- /dev/null +++ b/branch-4.1/search.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + + + +
                      + + + + + +
                      + + +
                      + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/searchindex.js b/branch-4.1/searchindex.js new file mode 100644 index 000000000..f9f4043f9 --- /dev/null +++ b/branch-4.1/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 5, 6, 22, 24, 25, 29, 30, 32, 33, 35, 37, 38], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 26, 27, 28, 29, 32, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 26], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 29, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 27, 28, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 26, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 27, 34, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 33], "user": [1, 2, 6, 7, 9, 26, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9, 32], "refer": [1, 6, 9, 13], "upgrad": [1, 13], "lesson": [1, 9, 28, 29], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 26, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 19, 21, 22, 23, 24, 25, 29, 31, 33, 34, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 29, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 26, 30, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 31, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 27, 30, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 26, 29, 32, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 14, 19, 21, 22, 23, 24, 25], "onc": [2, 12, 21, 25, 31, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 19, 21, 22, 23, 24, 25, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 34, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 32, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 30, 31, 32, 38, 41], "one": [2, 6, 7, 17, 21, 22, 23, 24, 25, 27, 29, 30, 33, 34, 35, 41], "both": [2, 5, 6, 19, 22, 24, 25, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 26, 39, 41], "updat": [2, 5, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 19, 21, 22, 23, 24, 25, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 28, 33, 34, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 34, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 22, 24, 25, 27, 33, 34, 41], "advis": [2, 34], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25], "databas": [2, 5, 7, 21, 29, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 33, 41], "below": [2, 5, 6, 10, 14, 17], "read": [2, 5, 6, 8, 9, 10, 19, 21, 26, 30, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 19, 21, 22, 23, 24, 25, 26, 32, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 32, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 14, 21, 22, 23, 24, 25, 31, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 12, 14, 16, 19, 21, 22, 24, 25, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 12, 25], "yaml": [2, 5, 6, 12, 17], "To": [2, 4, 5, 6, 14, 17, 21, 22, 23, 24, 25], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 27, 28, 29, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "21": 2, "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 25], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 14, 16], "3": [2, 4, 5, 6, 14, 16, 20, 35], "5": [2, 5, 6, 14, 16, 19], "3000": [2, 5, 6, 22, 24, 25], "1000": [2, 33], "build": [2, 5], "plugin": 2, "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 14, 28, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25], "dir": [2, 7, 8, 22, 24, 25], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 10, 14, 16, 20, 24, 35], "3100": [2, 5], "rule": [2, 5, 7, 10, 25, 31, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 27, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 21, 25], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 29, 34, 35, 37, 39, 41], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 21, 33, 39], "section": [4, 5, 6, 12, 19, 21, 24, 25, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 29, 35, 37, 41], "default": [4, 5, 6, 7, 10, 14, 17, 19, 21, 23, 25, 30, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25], "scrape": [4, 5, 6], "interv": [4, 5, 6], "20": [4, 5, 6, 38], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 27, 28, 29, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 25, 32, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 27, 29, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 29, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 31, 39, 41], "need": [4, 5, 6, 7, 8, 14, 19, 25, 27, 28, 29, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 27, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 27, 34, 41], "out": [4, 5, 6, 8, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 26, 29, 41], "take": [4, 5, 6, 7, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "instruct": [5, 6, 22, 24, 25], "help": [5, 7, 10, 14, 41], "pleas": [5, 19], "most": [5, 10, 14, 25, 34, 36, 41], "current": [5, 6, 7, 10, 14, 19, 22, 24, 25], "common": [5, 7, 41], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 19], "standalon": 5, "thei": [5, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25], "consolid": 5, "componen": 5, "suggest": [5, 14, 25], "those": [5, 25], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 27, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 27, 28, 35, 41], "support": [5, 6, 14, 15, 26, 32, 41], "want": [5, 6, 10, 22, 24, 25], "latest": [5, 6, 7, 22, 24, 25], "releas": [5, 21, 22, 23, 24, 25], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25], "http": [5, 6, 8, 19, 21, 22, 24, 25, 29, 30, 32, 38], "com": [5, 6, 22, 24, 25, 29, 30, 32, 38], "archiv": [5, 6, 22, 24, 25], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 21, 22, 23, 24], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25], "p": [5, 7, 8, 19, 21, 22, 24, 25], "home": 5, "cd": [5, 6, 22, 24, 25], "verifi": [5, 23], "point": [5, 6, 14, 22, 24, 25], "browser": [5, 6, 8, 14, 19, 22, 24, 25], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 31, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 12, 19, 25, 26, 29, 30, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 27, 30, 31, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 29, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 14, 26, 27, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25], "scrap": 5, "job": [5, 6, 19], "onli": [5, 6, 7, 21, 23, 25, 29, 31, 33, 39, 41], "import": [5, 6, 7, 12, 21, 22, 24, 25, 33], "record": [5, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25], "prom_rul": [5, 25], "correct": [5, 23], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 32], "host": [5, 6, 7, 9, 19], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23], "127": [5, 7, 19], "right": [5, 6, 14, 34, 41], "typic": [5, 14, 25, 27, 29, 39, 41], "node_export": [5, 6, 7, 9, 16, 19], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 14, 17, 21, 23, 30, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 26, 31], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24], "scylla_reactor_util": 5, "At": [5, 14, 24, 25], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 6, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 27, 28, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 25, 34, 38], "tabl": [5, 6, 10, 16, 26, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 33, 34, 41], "give": [5, 13, 15], "strongli": 5, "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 26, 29, 34, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 31, 33], "mention": [5, 14], "previous": [5, 24, 25], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 30, 33, 41], "privileg": [5, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 25], "laptop": 6, "38": 6, "9": [6, 16, 25], "34": 6, "8": [6, 16, 21, 25], "11": [6, 16], "32": 6, "10": [6, 10, 14, 16], "29": 6, "25": [6, 19], "avoid": [6, 14, 19, 30, 32, 41], "root": [6, 19, 22, 24, 25], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 22, 24, 25], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 29, 41], "higher": [6, 25, 29, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 26, 27, 28], "agent": [6, 7, 8, 9, 16, 19], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25], "within": [6, 10, 14], "protect": 6, "assign": 6, "place": [6, 7, 8, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 27, 29, 30, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25], "2019": [6, 16, 38], "reach": [6, 8, 12, 29, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 29, 30, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 28, 31, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 29, 30, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 26, 27, 28, 29, 30, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 34], "disk": [7, 10, 14, 19, 26, 28, 34], "possibl": [7, 10, 17, 32, 41], "api": [7, 8, 17, 21], "resolv": 7, "explicitli": [7, 14], "request": [7, 17, 34, 40], "how": [7, 8, 10, 14, 22, 24, 25, 27, 28, 29, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 14], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14, 34], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 28], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 27, 28, 29, 34, 35, 41], "abov": [8, 22, 24, 25], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 29, 38, 41], "email": [9, 10], "slack": [9, 10], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11, 34], "wrong": [10, 11, 14, 19, 25, 39, 41], "shown": [10, 19, 22, 24, 25], "overview": [10, 25, 34], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 32, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "sever": [10, 13, 15, 42], "annot": 10, "descript": [10, 34], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 41], "rout": [10, 29, 41], "repres": 10, "tree": 10, "win": [10, 19], "inhibit": 10, "mute": 10, "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 27], "simul": 10, "actual": [10, 37], "low": [10, 41], "space": 10, "lower": [10, 41], "fire": 10, "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 31, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "promemtheu": 12, "json": [12, 14], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "shard": [12, 25, 34], "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 19, 21], "explain": [14, 22, 24, 25, 34], "intern": [14, 29, 41], "potenti": [14, 34, 41], "issu": [14, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": [14, 25, 34, 35, 37], "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 30, 41], "tooltip": 14, "msresolut": 14, "share": [14, 33], "sort": [14, 32, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 32, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 30, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 23, 25], "calcul": [14, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "24": [14, 25], "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": [14, 34], "usual": [14, 19, 34, 41], "easier": 14, "wrapper": 14, "re": [14, 29], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2018": [16, 30], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "56090": 19, "old": [19, 22, 23, 24, 25], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "non": [19, 21, 28, 29, 34, 38, 41], "post": 19, "past": [19, 23], "mai": [19, 33, 34, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": [19, 34], "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 29, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 26, 27, 28, 30, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "while": [19, 21, 22, 24, 25, 33], "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25], "migrat": [21, 22, 24], "lose": 21, "histor": [21, 25], "process": [21, 33, 40], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25], "3001": [21, 22, 24, 25], "9091": [21, 22, 24, 25], "9094": 21, "fail": [21, 27, 29, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25], "back": [21, 27], "recommend": [22, 24, 25], "uninstal": [22, 24, 25], "minor": [22, 24, 25], "9095": [22, 24, 25], "brows": [22, 24, 25], "satisfi": [22, 24, 25], "shut": [22, 24, 25], "caus": [22, 24, 25, 29, 41], "blackout": [22, 24, 25], "normal": [22, 24, 25], "dure": [22, 24, 25], "oper": [22, 24, 25, 34, 41], "complet": [22, 24, 25], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 34, 41], "newer": [24, 25], "ensur": 25, "patch": 25, "skip": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 28], "latenc": [25, 29, 33, 34, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 27], "mechan": [25, 27], "present": 25, "reli": [25, 41], "miss": 25, "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 27, 28, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "primari": [26, 41], "kei": [26, 32, 41], "scan": 26, "These": [26, 41], "kind": [26, 41], "bigger": 26, "care": [26, 27, 28, 41], "replicationfactor": [27, 28], "piec": 27, "determin": [27, 28, 35, 41], "repli": [27, 28, 30, 35, 37, 41], "unavail": [27, 41], "client": [27, 30, 34, 41], "respond": 27, "accompani": 27, "deep": 27, "understand": 27, "acknowledg": 28, "coordin": [28, 29, 35, 37, 41], "hint": 28, "fact": 28, "yet": 28, "ideal": [29, 41], "resourc": [29, 32, 41], "replic": [29, 35, 37, 41], "prepar": [29, 34, 38], "statement": [29, 31, 34, 38], "balanc": [29, 33, 34, 41], "polici": 29, "cours": 29, "intro": 29, "recap": 29, "ring": [29, 41], "architectur": 29, "chunk": [30, 41], "increas": [30, 33, 41], "overal": [30, 33, 41], "thu": 30, "www": [30, 38], "07": 30, "13": 30, "effici": [30, 41], "optim": [31, 38, 42], "concret": 31, "thumb": 31, "alwai": 31, "favor": 31, "partit": [32, 34], "BY": [32, 41], "ineffici": [32, 41], "consum": 32, "doc": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "practic": [34, 38], "solv": 34, "left": 34, "categori": [34, 41], "jump": 34, "warn": 34, "cell": 34, "model": [34, 38, 40, 41], "code": 34, "imbal": 34, "imbalanc": 34, "hot": 34, "bottleneck": [34, 38], "cach": 34, "hit": 34, "awar": 34, "order": [34, 41], "due": 34, "unsatisfi": 34, "faulti": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "explan": 38, "08": 38, "best": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "might": 39, "shed": 40, "drop": [40, 41], "repair": 40, "que": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "prevent": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "cost": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 9, 13], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 34, 42], "us": [2, 5, 6, 8, 12, 14, 26, 27, 28, 32, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 30, 38], "node": [6, 36], "from": [6, 14], "manag": [6, 7, 11, 19], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 34, 41], "all": [7, 22, 24, 25, 27], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 26, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 27, 28, 35, 41], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 12, 14], "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "upload": 12, "procedur": [13, 21, 22, 23, 24, 25], "modifi": 14, "limit": 14, "consist": [14, 27, 28, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25], "latest": 21, "new": [21, 22, 23, 24, 25], "rule": 21, "4": [21, 25], "move": [21, 22, 24, 25], "old": 21, "b": 21, "rollback": [21, 22, 23, 24, 25], "link": [21, 22, 23, 24, 25, 28, 29, 30, 32, 38], "y": [22, 24, 25], "": [22, 24, 25], "i": [22, 24, 25, 36], "run": [22, 24, 25], "correct": [22, 24, 25], "correctli": [22, 24], "kill": [22, 24, 25], "node_export": 23, "test": [24, 25], "mode": [24, 25], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "some": [26, 27, 28, 29, 30, 31, 32, 35, 37], "allow": [26, 41], "filter": [26, 41], "ani": 28, "univers": [28, 29], "ar": [29, 30, 31, 38], "token": [29, 41], "awar": [29, 41], "select": 30, "non": [30, 31], "page": [30, 41], "blog": [30, 38], "prepar": [31, 39, 41], "revers": [32, 41], "order": 32, "document": 32, "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Some SELECT queries are non-paged": [[30, "some-select-queries-are-non-paged"]], "Blog-post Links": [[30, "blog-post-links"]], "Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "Some queries are non-prepared": [[31, "some-queries-are-non-prepared"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "Some queries use reverse order": [[32, "some-queries-use-reverse-order"]], "Documentation link": [[32, "documentation-link"]], "Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[17, "prometheus"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "Validation": [[14, "validation"], [21, "validation"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "Upgrade Procedure": [[23, "upgrade-procedure"], [21, "upgrade-procedure"], [22, "upgrade-procedure"], [24, "upgrade-procedure"], [25, "upgrade-procedure"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[23, "install-the-new-monitoring-stack"], [21, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[23, "validate-the-upgrade"], [21, "validate-the-upgrade"]], "Rollback": [[23, "rollback"], [21, "rollback"]], "Related Links": [[23, "related-links"], [21, "related-links"], [22, "related-links"], [24, "related-links"], [25, "related-links"]], "Some queries use Consistency Level: ANY": [[28, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[28, "link-to-scylla-university"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[22, "setting-the-server-s-files"], [24, "setting-the-server-s-files"], [25, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[22, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[22, "validate-the-version-installed-correctly"], [24, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[22, "kill-all-containers"], [24, "kill-all-containers"], [25, "kill-all-containers"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Some queries use ALLOW FILTERING": [[26, "some-queries-use-allow-filtering"]], "Some queries use Consistency Level: ALL": [[27, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Rollback to version 3.x": [[24, "rollback-to-version-3-x"], [25, "rollback-to-version-3-x"]], "Some queries are not token-aware": [[29, "some-queries-are-not-token-aware"]], "University link": [[29, "university-link"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "System Overload": [[40, "system-overload"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Minimal Production System Recommendations": [[4, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[4, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[4, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "ScyllaDB Monitoring Stack": [[1, "scylladb-monitoring-stack"], [9, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.1/sitemap.xml b/branch-4.1/sitemap.xml new file mode 100644 index 000000000..92cbe784a --- /dev/null +++ b/branch-4.1/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.1/troubleshooting/index.html b/branch-4.1/troubleshooting/index.html new file mode 100644 index 000000000..356fb126a --- /dev/null +++ b/branch-4.1/troubleshooting/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Troubleshooting Guide for Scylla Monitoring Stack

                      +
                      +
                      +

                      Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/troubleshooting/monitor_troubleshoot.html b/branch-4.1/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..b5081fc6d --- /dev/null +++ b/branch-4.1/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,876 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Troubleshoot Scylla Monitoring Stack

                      +

                      This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                      +
                      +

                      Problem

                      +
                      +

                      Scylla-Manager 2.2 with Duplicate information

                      +

                      Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                      +
                        +
                      • For Manager server: from 56090 to 5090

                      • +
                      • For Manager Agent: from 56090 to 5090

                      • +
                      +

                      For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                      +

                      However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                      +

                      The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                      +

                      Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                      +
                      +
                      +

                      A Container Fails To Start

                      +

                      When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                      +
                      Wait for Prometheus container to start........Error: Prometheus container failed to start
                      +
                      +
                      +

                      Should this happen, check the Docker logs for more information.

                      +
                      docker logs aprom
                      +
                      +
                      +

                      Usually the reason for the failure is described in the logs.

                      +
                      +
                      +

                      Files And Directory Permissions

                      +
                      +

                      Note

                      +

                      Avoid running Docker containers as root.

                      +
                      +

                      The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                      +

                      If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                      +
                      +

                      Note

                      +

                      If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                      +
                      +

                      For example if your Prometheus data directory is /prom-data and you are using centos user

                      +
                      ls -la /|grep prom-data
                      +
                      +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                      +
                      +sudo chown -R centos:centos /prom-data
                      +
                      +ls -la /|grep prom-data
                      +
                      +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                      +
                      +
                      +
                      +
                      +

                      No Data Points

                      +

                      No data points on all data charts.

                      +
                      +

                      Solution

                      +

                      If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                      +
                        +
                      1. Login to the Prometheus console:

                      2. +
                      3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                      4. +
                      5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                      6. +
                      +
                      +
                        +
                      • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                      • +
                      • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                      • +
                      • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                      • +
                      +
                      +

                      For example:

                      +
                      ./start-all.sh -v 3.1
                      +
                      +
                      +

                      More on start-all.sh options.

                      +
                      +
                      +
                      +

                      Grafana Chart Shows Error (!) Sign

                      +

                      Run this procedure on the Scylla Monitoring Stack server.

                      +

                      If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                      +
                      +

                      Solution

                      +

                      On the Scylla Monitoring Stack server:

                      +
                        +
                      1. Check Prometheus is running using docker ps.

                      2. +
                      +
                        +
                      • If it is not running check the prometheus.yml for errors.

                      • +
                      +

                      For example:

                      +
                      CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                      +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                      +
                      +
                      +
                        +
                      • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                      • +
                      +
                      +
                      +
                      +

                      Grafana Shows Server Level Metrics, but not Scylla Metrics

                      +

                      Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                      +
                      +

                      Solution

                      +
                        +
                      • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                      • +
                      +

                      For example

                      +
                      curl 172.17.0.2:9180/metrics
                      +
                      +
                      +
                      +
                      +
                      +

                      Grafana Shows Scylla Metrics, but not Server Level Metrics

                      +

                      Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                      +
                      +

                      Solution

                      +

                      1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                      +
                        +
                      1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                      2. +
                      +
                      +
                      +

                      Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                      +

                      While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                      +

                      If the node_exporter service is not starting it may need to be updated manually.

                      +

                      Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                      +
                      +
                      +
                      +

                      Working with Wireshark

                      +

                      No metrics shown in the Scylla Monitoring Stack.

                      +
                        +
                      1. Install wireshark

                      2. +
                      +

                      2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                      +

                      For example:

                      +
                      tshark -i eth0 -f "dst port 9180"
                      +
                      +
                      +

                      Capture from Scylla node towards Scylla Monitoring Stack server.

                      +

                      In this example, Scylla is running.

                      +
                      Monitor ip        Scylla node ip
                      +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                      +
                      +
                      +

                      In this example, Scylla is not running

                      +
                      Monitor ip        Scylla node ip
                      +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                      +
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/index.html b/branch-4.1/upgrade/index.html new file mode 100644 index 000000000..4e67cb13b --- /dev/null +++ b/branch-4.1/upgrade/index.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Scylla Monitoring Stack

                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.1/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..2705fdd2d --- /dev/null +++ b/branch-4.1/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,809 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                      +

                      This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

                      +

                      Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                      +
                      +

                      Upgrade Procedure

                      +
                      +

                      1. Upgrade to the latest 1.x version

                      +

                      Before starting the upgrade procedure, make sure you are running the latest 1.x version

                      +
                      +
                      +

                      2. Install the new monitoring stack

                      +
                        +
                      1. Download the 2.x version from the release page.

                      2. +
                      3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                      4. +
                      5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                        +
                          +
                        • scylla_servers.yml

                        • +
                        • scylla_manager_servers.yml

                        • +
                        • node_exporter_servers.yml

                        • +
                        +
                      6. +
                      7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                      8. +
                      +
                      ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                      +
                      +
                      +
                      +

                      Note

                      +

                      Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                      +
                      +

                      While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                      +
                      ./kill-all.sh -g 3001 -p 9091 -m 9094
                      +
                      +
                      +
                      +

                      Validation

                      +

                      Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                      +
                      +
                      +
                      +

                      3. Alerting Rules

                      +

                      Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                      +
                      +
                      +

                      4. Moving to Prometheus 2.x

                      +

                      Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                      +

                      Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                      +
                      +

                      a. Set the old system

                      +

                      The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                      +
                        +
                      • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                      • +
                      • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                      • +
                      +
                      +

                      Note

                      +

                      After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                      +
                      +
                      +
                      +

                      b. Set the new system

                      +

                      The following step will allow the new monitoring system to read historical metrics from the old system.

                      +
                        +
                      • In the Prometheus prometheus.yml.template file add the following at the end:

                      • +
                      +
                      remote_read:
                      +  - url: "http://{ip}:9111/api/v1/read"
                      +
                      +
                      +

                      Where {ip} is the ip of the old system.

                      +
                        +
                      • restart the new stack

                      • +
                      +
                      +
                      +
                      +

                      Validate the upgrade

                      +

                      You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                      +
                      +
                      +
                      +

                      Rollback

                      +

                      In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                      +
                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..1baaad7d1 --- /dev/null +++ b/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,803 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                      +

                      This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                      +
                      +

                      Upgrade Procedure

                      +

                      We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                      +

                      Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                      +
                      +

                      Install 2.y (The new version)

                      +
                      wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                      +unzip scylla-monitoring-2.y.zip
                      +cd scylla-monitoring-scylla-monitoring-2.y/
                      +
                      +
                      +

                      Replace “y” with the new minor release number, for example, 2.1.zip

                      +
                      +
                      +

                      Setting the server’s files

                      +

                      Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                      +
                      cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                      +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                      +
                      +
                      +
                      +
                      +

                      Validate the new version is running the correct version

                      +

                      Starting from Scylla-Monitoring version 2.2, you can run:

                      +
                      ./start-all.sh --version
                      +
                      +
                      +

                      To validate the Scylla-Monitoring version.

                      +
                      +
                      +

                      Validate the version installed correctly

                      +

                      To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                      +
                      ./start-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      Browse to http://{ip}:9091 +And check the Grafana dashboard

                      +

                      Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                      +
                      +

                      Caution

                      +

                      Important: do not use the local dir flag when testing!

                      +
                      +

                      When you are satisfied with the data in the dashboard, you can shut down the containers.

                      +
                      +

                      Caution

                      +

                      Important: Do not kill the 2.x version that is currently running.

                      +
                      +

                      Use the following command to kill the containers:

                      +
                      ./kill-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      You can start and stop the new 2.y version while testing.

                      +
                      +
                      +

                      Move to version 2.y (the new version)

                      +

                      Note: migrating will cause a few seconds of blackout in the system.

                      +

                      We assume that you are using external volume to store the metrics data.

                      +
                      +

                      Kill all containers

                      +

                      Follow the instruction on how to kill the 2.y version when in testing mode.

                      +

                      To kill the 2.x version containers, run:

                      +
                      ./kill-all.sh
                      +
                      +
                      +

                      Start version 2.y in normal mode

                      +

                      From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                      +
                      ./start-all.sh -d /path/to/data/dir
                      +
                      +
                      +

                      Point your browser to http://{ip}:3000 and see that the data is there.

                      +
                      +
                      +
                      +

                      Rollback to version 2.x

                      +

                      To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                      +

                      To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                      +
                      ./kill-all.sh
                      +cd /path/to/scylla-grafana-2.x/
                      +./start-all.sh -d /path/to/data/dir
                      +
                      +
                      +
                      +
                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..c7800f5ba --- /dev/null +++ b/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,767 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                      +

                      This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

                      +

                      Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                      +
                      +

                      Upgrade Procedure

                      +
                      +

                      1. Validate node_exporter version

                      +

                      Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                      +

                      If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                      +
                      +
                      +

                      2. Install the new monitoring stack

                      +
                        +
                      1. Download the 3.x version from the release page.

                      2. +
                      3. Unzip it into a different directory.

                      4. +
                      5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                        +
                          +
                        • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                        • +
                        • scylla_manager_servers.yml

                        • +
                        +
                        +
                        +

                        Note

                        +

                        The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                        +
                        +
                        +
                      6. +
                      7. Stop the old monitoring stack

                        +
                        +
                        ./kill-all.sh
                        +
                        +
                        +
                        +
                      8. +
                      9. Start the new monitoring stack

                        +
                        +
                        ./start-all.sh -d /prometheus-data-path
                        +
                        +
                        +
                        +
                      10. +
                      +
                      +
                      +

                      Validate the upgrade

                      +

                      You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                      +

                      Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                      +
                      +
                      +
                      +

                      Rollback

                      +

                      To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                      +
                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..1ea6f2083 --- /dev/null +++ b/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                      +

                      This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                      +
                      +

                      Upgrade Procedure

                      +

                      We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                      +

                      Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                      +
                      +

                      Install 3.y (The new version)

                      +
                      wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                      +unzip scylla-monitoring-3.y.zip
                      +cd scylla-monitoring-scylla-monitoring-3.y/
                      +
                      +
                      +

                      Replace “y” with the new minor release number, for example, 3.0.1.zip

                      +
                      +
                      +

                      Setting the server’s files

                      +

                      Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                      +
                      cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                      +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                      +
                      +
                      +
                      +
                      +

                      Validate the new version is running the correct version

                      +

                      Starting from Scylla-Monitoring version 2.2, you can run:

                      +
                      ./start-all.sh --version
                      +
                      +
                      +

                      To validate the Scylla-Monitoring version.

                      +
                      +
                      +

                      Validate the version installed correctly

                      +

                      To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                      +
                      ./start-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      Browse to http://{ip}:9091 +And check the Grafana dashboard

                      +

                      Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                      +
                      +

                      Caution

                      +

                      Important: do not use the local dir flag when testing!

                      +
                      +

                      When you are satisfied with the data in the dashboard, you can shut down the containers.

                      +
                      +

                      Caution

                      +

                      Important: Do not kill the 3.x version that is currently running.

                      +
                      +
                      +
                      +

                      Killing the new 3.y Monitoring stack in testing mode

                      +

                      Use the following command to kill the containers:

                      +
                      ./kill-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      You can start and stop the new 3.y version while testing.

                      +
                      +
                      +

                      Move to version 3.y (the new version)

                      +

                      Note: migrating will cause a few seconds of blackout in the system.

                      +

                      We assume that you are using external volume to store the metrics data.

                      +
                      +

                      Kill all containers

                      +

                      At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                      +

                      Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                      +

                      kill the older 3.x version containers by running:

                      +
                      ./kill-all.sh
                      +
                      +
                      +

                      Start version 3.y in normal mode

                      +

                      From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                      +
                      ./start-all.sh -d /path/to/data/dir
                      +
                      +
                      +

                      Point your browser to http://{ip}:3000 and see that the data is there.

                      +
                      +
                      +
                      +

                      Rollback to version 3.x

                      +

                      To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                      +

                      To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                      +
                      ./kill-all.sh
                      +cd /path/to/scylla-grafana-3.x/
                      +./start-all.sh -d /path/to/data/dir
                      +
                      +
                      +
                      +
                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..c2143fae9 --- /dev/null +++ b/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,954 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                      +

                      This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                      +
                      +

                      Upgrade Procedure

                      +

                      We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                      +

                      Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                      +
                      +

                      Install 4.y (The new version)

                      +
                      wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                      +unzip scylla-monitoring-4.y.zip
                      +cd scylla-monitoring-scylla-monitoring-4.y/
                      +
                      +
                      +

                      Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                      +
                      +
                      +

                      Setting the server’s files

                      +

                      Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                      +
                      cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                      +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                      +
                      +
                      +
                      +
                      +

                      Validate the new version is running the correct version

                      +

                      run:

                      +
                      ./start-all.sh --version
                      +
                      +
                      +

                      To validate the Scylla-Monitoring version.

                      +
                      +
                      +
                      +

                      Running in test mode

                      +

                      This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                      +
                      +

                      Running second monitoring stack

                      +

                      We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                      +
                      ./start-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      Browse to http://{ip}:9091 and check the Grafana dashboard.

                      +

                      Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                      +
                      +

                      Caution

                      +

                      Important: do not use the local dir flag when testing!

                      +
                      +

                      When you are satisfied with the data in the dashboard, you can shut down the containers.

                      +
                      +

                      Caution

                      +

                      Important: Do not kill the 3.x version that is currently running!

                      +
                      +
                      +
                      +

                      Killing the new 4.y Monitoring stack in testing mode

                      +

                      Use the following command to kill the containers:

                      +
                      ./kill-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      You can start and stop the new 4.y version while testing.

                      +
                      +
                      +
                      +

                      Migrating

                      +
                      +

                      Move to version 4.y (the new version)

                      +

                      Note: migrating will cause a few seconds of blackout in the system.

                      +

                      We assume that you are using external volume to store the metrics data.

                      +
                      +

                      Backup

                      +

                      We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                      +
                      +
                      +

                      Kill all containers

                      +

                      At this point you have two monitoring stacks installed with the older version running.

                      +

                      If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                      +

                      kill the older 3.x version containers by running:

                      +
                      ./kill-all.sh
                      +
                      +
                      +

                      Start version 4.y in normal mode

                      +

                      From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                      +
                      ./start-all.sh -d /path/to/copy/data/dir
                      +
                      +
                      +

                      Point your browser to http://{ip}:3000 and see that the data is there.

                      +
                      +
                      +
                      +

                      Rollback to version 3.x

                      +

                      To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                      +

                      To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                      +
                      ./kill-all.sh
                      +cd /path/to/scylla-grafana-3.x/
                      +./start-all.sh -d /path/to/original/data/dir
                      +
                      +
                      +
                      +
                      +
                      +

                      Post-installation: Metrics back-filling

                      +

                      Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                      +

                      For example, this is a recording rule that calculates the p99 write latency:

                      +
                      - record: wlatencyp99
                      +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                      +  labels:
                      +    by: "instance,shard"
                      +
                      +
                      +

                      For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                      +

                      Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                      +
                      +
                      +

                      Note

                      +

                      If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                      +
                      +
                      +
                      +../_images/before-backfilling.png +
                      +

                      This is an example of missing latency graph

                      +
                      +
                      +

                      The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                      +

                      For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                      +

                      In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                      +

                      The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                      +
                      +

                      Determine the backfilling period

                      +

                      When you run the backfilling process you need to determine the start time and end time.

                      +
                      +

                      Determine the start time

                      +

                      The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                      +

                      If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                      +

                      For the rest of this example, we will assume that your retention time is 360 days.

                      +
                      +
                      +

                      Determine the end time

                      +

                      Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                      +

                      If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                      +

                      That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                      +

                      The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                      +
                      +
                      +
                      +

                      Backfilling Process

                      +
                      +

                      backup

                      +

                      If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                      +

                      To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                      +
                      +
                      +

                      Restart the monitoring stack

                      +

                      You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                      +

                      -b "--storage.tsdb.allow-overlapping-blocks"

                      +
                      +
                      +

                      Create the data files

                      +

                      We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                      +

                      The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                      +

                      Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                      +
                      docker exec -it aprom sh
                      +cd /prometheus/data/
                      +promtool tsdb create-blocks-from rules \
                      +--start $start \
                      +--end $end \
                      +--url http://localhost:9090 \
                      +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                      +
                      +
                      +

                      It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                      +
                      +
                      +

                      Note

                      +

                      Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                      +
                      +
                      +
                      +
                      +

                      Copy the data files

                      +

                      Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                      +

                      Copy the data files to the Prometheus directory:

                      +
                      cp data/* .
                      +
                      +
                      +

                      The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                      +

                      Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                      +
                      +../_images/after-backfilling.jpg +
                      +

                      Un example: after loading half of the data

                      +
                      +
                      +
                      +
                      +
                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.1/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..94c963914 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries use ALLOW FILTERING

                      +

                      Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                      +

                      These kinds of queries can create a bigger load on Scylla, and should be used with care.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlCLAll.html b/branch-4.1/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..3837ce763 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries use Consistency Level: ALL

                      +

                      Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                      +

                      Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                      +

                      Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlCLAny.html b/branch-4.1/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..94a79e3df --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries use Consistency Level: ANY

                      +

                      Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                      +

                      Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.1/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..34bdea77e --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries are not token-aware

                      +

                      Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                      +

                      Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlNonPaged.html b/branch-4.1/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..43a5b9de8 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some SELECT queries are non-paged

                      +

                      By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                      +
                      +

                      Blog-post Links

                      +

                      https://www.scylladb.com/2018/07/13/efficient-query-paging/

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.1/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..7b9c11a93 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries are non-prepared

                      +

                      Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlReverseOrder.html b/branch-4.1/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..f5b5413cf --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries use reverse order

                      +

                      Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                      +

                      Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/heavyCompaction.html b/branch-4.1/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..1d9f1d848 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Compaction takes lots of memory and CPU

                      +

                      ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                      +

                      If this is the case, you can do one of the following:

                      +
                        +
                      • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                        +
                        +
                          +
                        • In the scylla.yml configuration file: compaction_static_shares: 100

                        • +
                        • In the command line when starting ScyllaDB: --compaction-static-shares 100

                        • +
                        +
                        +

                        You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                        +
                      • +
                      • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                      • +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/index.html b/branch-4.1/use-monitoring/advisor/index.html new file mode 100644 index 000000000..2de78e15d --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/index.html @@ -0,0 +1,722 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Stack Advisor

                      +
                      +
                      +

                      The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                      +
                      +

                      The Advisor section

                      +
                      +../../_images/advisor_panel.png +
                      +

                      The Advisor section

                      +
                      +
                      +

                      The Advisor section is located on the Overview dashboard and consists of two parts:

                      +

                      On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                      +

                      For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                      +

                      On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                      +

                      For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                      +

                      Each Advisor issue is explained in detail:

                      + +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/nodeCLErrors.html b/branch-4.1/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..b399cccf2 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Some operation failed due to unsatisfied consistency level

                      +

                      ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                      +

                      For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                      +

                      When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/nodeIOErrors.html b/branch-4.1/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..8fca924c9 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      I/O Errors can indicate a node with a faulty disk

                      +

                      I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.1/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..97d088e6c --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Some operations failed on the replica side

                      +

                      ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                      +

                      An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.1/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..f1f99d43d --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      CQL queries are not balanced among shards

                      +

                      For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                      +

                      There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                      +
                      +

                      Blog post link

                      +

                      https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.1/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..8dae7fb4a --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,693 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Prepared statements cache eviction

                      +

                      Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                      +
                        +
                      • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                      • +
                      • The prepared statements cache might be too small for the number of prepared statements.

                      • +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/systemOverload.html b/branch-4.1/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..9e6b38206 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      System Overload

                      +

                      There could be multiple indications that a system is overloaded:

                      +
                        +
                      • Timeouts

                      • +
                      • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                      • +
                      • CPU at 100% when no background process (like compaction or repair) runs.

                      • +
                      • Ques are getting filled.

                      • +
                      +

                      If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/cql_optimization.html b/branch-4.1/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..b1965a35c --- /dev/null +++ b/branch-4.1/use-monitoring/cql_optimization.html @@ -0,0 +1,809 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      The CQL Optimization

                      +

                      The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                      +
                      +../_images/cql_optimization_master.png +
                      +

                      The CQL Dashboard

                      +
                      +
                      +

                      The upper part of the dashboard holds CQL related metrics.

                      +

                      The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                      +
                      +

                      Note

                      +

                      Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                      +
                      +

                      The following sections describe each of the dashboard’s panel

                      +
                      +

                      Prepared Statements

                      +

                      Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                      +

                      Using prepared statements has the following benefits:

                      +
                        +
                      • The database only needs to parse the query once

                      • +
                      • The driver can route the query to the right node

                      • +
                      • Using place-holders and values is safer and prevents CQL-Injection

                      • +
                      +

                      The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                      +

                      The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                      +
                      +
                      +

                      Token Aware

                      +

                      Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                      +

                      Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                      +

                      The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                      +

                      The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                      +
                      +
                      +

                      Paged Queries

                      +

                      By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                      +

                      The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                      +

                      The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                      +
                      +
                      +

                      Reversed CQL Reads

                      +

                      Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                      +

                      Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                      +

                      For example, look at the following table:

                      +
                      CREATE TABLE ks1.table_demo (
                      +   category text,
                      +   type int,
                      +   PRIMARY KEY (category, type))
                      +WITH CLUSTERING ORDER BY (type DESC);
                      +
                      +
                      +

                      The following query uses reverse order:

                      +
                      select * from ks1.table_demo where category='cat1' order by type ASC;
                      +
                      +
                      +

                      The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                      +

                      The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                      +
                      +
                      +

                      ALLOW FILTERING

                      +

                      Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                      +

                      These kinds of queries can create a big load on the system, and should be used with care.

                      +

                      The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                      +

                      The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                      +

                      The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                      +

                      The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                      +

                      The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                      +
                      +
                      +

                      Consistency Level

                      +

                      Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                      +

                      The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                      +

                      Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                      +

                      The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                      +

                      The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                      +

                      The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                      +

                      The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                      +
                      +
                      +

                      Cross DC

                      +

                      Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                      +
                      +
                      +

                      Cross DC Consistency Level

                      +

                      Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                      +
                      +
                      +

                      Cross DC read requests

                      +
                      +

                      Note

                      +

                      The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                      +
                      +

                      In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                      +

                      The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/index.html b/branch-4.1/use-monitoring/index.html new file mode 100644 index 000000000..d111d5aaa --- /dev/null +++ b/branch-4.1/use-monitoring/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Using Scylla Monitoring Stack

                      +
                      +
                      +

                      There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.2/.buildinfo b/branch-4.2/.buildinfo new file mode 100644 index 000000000..0f9fad57c --- /dev/null +++ b/branch-4.2/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 748e549de8a4206971d10f604f5fbcaf +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.2/.doctrees/_common/monitor-description.doctree b/branch-4.2/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..bfe072547 Binary files /dev/null and b/branch-4.2/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-4.2/.doctrees/environment.pickle b/branch-4.2/.doctrees/environment.pickle new file mode 100644 index 000000000..8e704e9dc Binary files /dev/null and b/branch-4.2/.doctrees/environment.pickle differ diff --git a/branch-4.2/.doctrees/index.doctree b/branch-4.2/.doctrees/index.doctree new file mode 100644 index 000000000..d22f684c7 Binary files /dev/null and b/branch-4.2/.doctrees/index.doctree differ diff --git a/branch-4.2/.doctrees/install/docker_compose.doctree b/branch-4.2/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..f3551e56e Binary files /dev/null and b/branch-4.2/.doctrees/install/docker_compose.doctree differ diff --git a/branch-4.2/.doctrees/install/index.doctree b/branch-4.2/.doctrees/install/index.doctree new file mode 100644 index 000000000..544d827fd Binary files /dev/null and b/branch-4.2/.doctrees/install/index.doctree differ diff --git a/branch-4.2/.doctrees/install/min-prod-hw.doctree b/branch-4.2/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..cba5dd8fe Binary files /dev/null and b/branch-4.2/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.2/.doctrees/install/monitor_without_docker.doctree b/branch-4.2/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..c7a5f4e07 Binary files /dev/null and b/branch-4.2/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-4.2/.doctrees/install/monitoring_stack.doctree b/branch-4.2/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..61335c1ea Binary files /dev/null and b/branch-4.2/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-4.2/.doctrees/install/start_all.doctree b/branch-4.2/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..2176e7068 Binary files /dev/null and b/branch-4.2/.doctrees/install/start_all.doctree differ diff --git a/branch-4.2/.doctrees/install/thanos.doctree b/branch-4.2/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..d8e254ccb Binary files /dev/null and b/branch-4.2/.doctrees/install/thanos.doctree differ diff --git a/branch-4.2/.doctrees/intro.doctree b/branch-4.2/.doctrees/intro.doctree new file mode 100644 index 000000000..79df4ad83 Binary files /dev/null and b/branch-4.2/.doctrees/intro.doctree differ diff --git a/branch-4.2/.doctrees/procedures/alerts/alerting.doctree b/branch-4.2/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..4b2922fb4 Binary files /dev/null and b/branch-4.2/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.2/.doctrees/procedures/alerts/index.doctree b/branch-4.2/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..a32b5b4fc Binary files /dev/null and b/branch-4.2/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.2/.doctrees/procedures/datadog/index.doctree b/branch-4.2/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..96568138a Binary files /dev/null and b/branch-4.2/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.2/.doctrees/procedures/index.doctree b/branch-4.2/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..cd049db49 Binary files /dev/null and b/branch-4.2/.doctrees/procedures/index.doctree differ diff --git a/branch-4.2/.doctrees/procedures/updating_dashboard.doctree b/branch-4.2/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..e4bc82e7a Binary files /dev/null and b/branch-4.2/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-4.2/.doctrees/reference/index.doctree b/branch-4.2/.doctrees/reference/index.doctree new file mode 100644 index 000000000..22f3e62cb Binary files /dev/null and b/branch-4.2/.doctrees/reference/index.doctree differ diff --git a/branch-4.2/.doctrees/reference/matrix.doctree b/branch-4.2/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..e818c5d0c Binary files /dev/null and b/branch-4.2/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.2/.doctrees/reference/monitoring_apis.doctree b/branch-4.2/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..ff1fc72a5 Binary files /dev/null and b/branch-4.2/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-4.2/.doctrees/troubleshooting/index.doctree b/branch-4.2/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..5b083f811 Binary files /dev/null and b/branch-4.2/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.2/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-4.2/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..b47538345 Binary files /dev/null and b/branch-4.2/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/index.doctree b/branch-4.2/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..8939e3e09 Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..5e61aff58 Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..1ec545d18 Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..1ff1eb2d0 Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..979ae6d5a Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..6b255fc93 Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..ca4f4e0a7 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..a99f24da1 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..cf2a79f50 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..942fe1b71 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..bfe8f396f Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..72767b50b Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..cc4aca1d9 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..5b8743baf Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..ff55c2826 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..a0721033c Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..4ea8deccb Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..cef810718 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..d1d5ff63d Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..b35cdf4bc Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..17d132695 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/cql_optimization.doctree b/branch-4.2/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..3c4473a1f Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/index.doctree b/branch-4.2/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..2b8349edc Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.2/.nojekyll b/branch-4.2/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.2/404.html b/branch-4.2/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.2/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                      +

                      404

                      +

                      The ScyllaDB monster ate your page!

                      +

                      + Home +

                      +
                      + + + \ No newline at end of file diff --git a/branch-4.2/CNAME b/branch-4.2/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.2/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.2/_common/monitor-description.html b/branch-4.2/_common/monitor-description.html new file mode 100644 index 000000000..bcd681d3e --- /dev/null +++ b/branch-4.2/_common/monitor-description.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +

                      ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                      + + +
                      + + + + + +
                      + + +
                      + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.2/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.2/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..2839773fe --- /dev/null +++ b/branch-4.2/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,259 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + \ No newline at end of file diff --git a/branch-4.2/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.2/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.2/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.2/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.2/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..01b3668be --- /dev/null +++ b/branch-4.2/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,125 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={level=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.2/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.2/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..cfaca626e --- /dev/null +++ b/branch-4.2/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.2/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.2/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..51d635292 --- /dev/null +++ b/branch-4.2/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={level=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.2/_images/1.png b/branch-4.2/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.2/_images/1.png differ diff --git a/branch-4.2/_images/2.png b/branch-4.2/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.2/_images/2.png differ diff --git a/branch-4.2/_images/3.png b/branch-4.2/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.2/_images/3.png differ diff --git a/branch-4.2/_images/advisor_panel.png b/branch-4.2/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-4.2/_images/advisor_panel.png differ diff --git a/branch-4.2/_images/after-backfilling.jpg b/branch-4.2/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.2/_images/after-backfilling.jpg differ diff --git a/branch-4.2/_images/alertmanager.png b/branch-4.2/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.2/_images/alertmanager.png differ diff --git a/branch-4.2/_images/before-backfilling.png b/branch-4.2/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.2/_images/before-backfilling.png differ diff --git a/branch-4.2/_images/cql_optimization_master.png b/branch-4.2/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.2/_images/cql_optimization_master.png differ diff --git a/branch-4.2/_images/datadog.png b/branch-4.2/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.2/_images/datadog.png differ diff --git a/branch-4.2/_images/grafana.png b/branch-4.2/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.2/_images/grafana.png differ diff --git a/branch-4.2/_images/monitor.png b/branch-4.2/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-4.2/_images/monitor.png differ diff --git a/branch-4.2/_images/monitoring_stack.png b/branch-4.2/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.2/_images/monitoring_stack.png differ diff --git a/branch-4.2/_images/monitoring_stack1.png b/branch-4.2/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.2/_images/monitoring_stack1.png differ diff --git a/branch-4.2/_sources/_common/monitor-description.rst.txt b/branch-4.2/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.2/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.2/_sources/index.rst.txt b/branch-4.2/_sources/index.rst.txt new file mode 100644 index 000000000..97ea5ff5a --- /dev/null +++ b/branch-4.2/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on Scylla University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.2/_sources/install/docker_compose.rst.txt b/branch-4.2/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.2/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.2/_sources/install/index.rst.txt b/branch-4.2/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-4.2/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.2/_sources/install/min-prod-hw.rst.txt b/branch-4.2/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/branch-4.2/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                      + + + + + + + + + + + +
                      # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                      00
                      + +
                      + \ No newline at end of file diff --git a/branch-4.2/_sources/install/monitor_without_docker.rst.txt b/branch-4.2/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..08b771b73 --- /dev/null +++ b/branch-4.2/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                      `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.2/_sources/install/monitoring_stack.rst.txt b/branch-4.2/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..8f1705547 --- /dev/null +++ b/branch-4.2/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,395 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API <../../reference/monitoring_apis/#prometheus>`_ + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                      `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.2/_sources/install/start_all.rst.txt b/branch-4.2/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..c2e927a99 --- /dev/null +++ b/branch-4.2/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.2/_sources/install/thanos.rst.txt b/branch-4.2/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.2/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.2/_sources/intro.rst.txt b/branch-4.2/_sources/intro.rst.txt new file mode 100644 index 000000000..67e73435b --- /dev/null +++ b/branch-4.2/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.2/_sources/procedures/alerts/alerting.rst.txt b/branch-4.2/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.2/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.2/_sources/procedures/alerts/index.rst.txt b/branch-4.2/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.2/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.2/_sources/procedures/datadog/index.rst.txt b/branch-4.2/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..23bfc480c --- /dev/null +++ b/branch-4.2/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,63 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the promemtheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +Add datadog recording rules +=========================== +Non cloud users, download the rules configuration file :download:`datadog.rules.yml ` and place it under prometheus/prom_rules/. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.2/_sources/procedures/index.rst.txt b/branch-4.2/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..9e17f2aa1 --- /dev/null +++ b/branch-4.2/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.2/_sources/procedures/updating_dashboard.rst.txt b/branch-4.2/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.2/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.2/_sources/reference/index.rst.txt b/branch-4.2/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-4.2/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.2/_sources/reference/matrix.rst.txt b/branch-4.2/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..5e3a70d72 --- /dev/null +++ b/branch-4.2/_sources/reference/matrix.rst.txt @@ -0,0 +1,140 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.2/_sources/reference/monitoring_apis.rst.txt b/branch-4.2/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..ce53e9d8f --- /dev/null +++ b/branch-4.2/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring_stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.2/_sources/troubleshooting/index.rst.txt b/branch-4.2/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-4.2/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-4.2/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-4.2/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..3de2b7d6f --- /dev/null +++ b/branch-4.2/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,230 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.2/_sources/upgrade/index.rst.txt b/branch-4.2/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..817f65247 --- /dev/null +++ b/branch-4.2/_sources/upgrade/index.rst.txt @@ -0,0 +1,42 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                      +
                      +
                      +
                      Upgrade Scylla Open Source
                      +
                      +
                      + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                      +
                      +
                      diff --git a/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..0e4fd3baa --- /dev/null +++ b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,103 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + + + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..3bb8af42b --- /dev/null +++ b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,132 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..d1974adfc --- /dev/null +++ b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,63 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..a356f5c21 --- /dev/null +++ b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,138 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..b64fd5d7e --- /dev/null +++ b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,281 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-4.2/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.2/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.2/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.2/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.2/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.2/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.2/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.2/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.2/_sources/use-monitoring/cql_optimization.rst.txt b/branch-4.2/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.2/_sources/use-monitoring/index.rst.txt b/branch-4.2/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.2/_static/basic.css b/branch-4.2/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.2/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.2/_static/check-solid.svg b/branch-4.2/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.2/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.2/_static/clipboard.min.js b/branch-4.2/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.2/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.2/_static/copybutton.css b/branch-4.2/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.2/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                      Short

                      + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.2/_static/copybutton.js b/branch-4.2/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.2/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.2/_static/copybutton_funcs.js b/branch-4.2/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.2/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.2/_static/css/main.css b/branch-4.2/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-4.2/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.2/_static/doctools.js b/branch-4.2/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.2/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.2/_static/documentation_options.js b/branch-4.2/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.2/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.2/_static/file.png b/branch-4.2/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.2/_static/file.png differ diff --git a/branch-4.2/_static/img/banner-background.svg b/branch-4.2/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.2/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.2/_static/img/favicon-228x228.png b/branch-4.2/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.2/_static/img/favicon-228x228.png differ diff --git a/branch-4.2/_static/img/favicon-32x32.png b/branch-4.2/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.2/_static/img/favicon-32x32.png differ diff --git a/branch-4.2/_static/img/favicon.ico b/branch-4.2/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.2/_static/img/favicon.ico differ diff --git a/branch-4.2/_static/img/icons/icon-about-team.svg b/branch-4.2/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.2/_static/img/icons/icon-about-us-m.svg b/branch-4.2/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-about-us.svg b/branch-4.2/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-alternator.svg b/branch-4.2/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-apps.svg b/branch-4.2/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-architecture.svg b/branch-4.2/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.2/_static/img/icons/icon-benchmarks.svg b/branch-4.2/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.2/_static/img/icons/icon-blog.svg b/branch-4.2/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.2/_static/img/icons/icon-careers.svg b/branch-4.2/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.2/_static/img/icons/icon-chevron-left.svg b/branch-4.2/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.2/_static/img/icons/icon-chevron-right.svg b/branch-4.2/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.2/_static/img/icons/icon-circe.svg b/branch-4.2/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-clock.svg b/branch-4.2/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-close.svg b/branch-4.2/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-cloud-docs.svg b/branch-4.2/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-cloud.svg b/branch-4.2/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-comparison.svg b/branch-4.2/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.2/_static/img/icons/icon-contact-us.svg b/branch-4.2/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.2/_static/img/icons/icon-developers-blog.svg b/branch-4.2/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.2/_static/img/icons/icon-docs.svg b/branch-4.2/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.2/_static/img/icons/icon-enterprise-m.svg b/branch-4.2/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-enterprise.svg b/branch-4.2/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-events.svg b/branch-4.2/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.2/_static/img/icons/icon-exclamation.svg b/branch-4.2/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-expand.svg b/branch-4.2/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-forum.svg b/branch-4.2/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-getting-started.svg b/branch-4.2/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-glossary.svg b/branch-4.2/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-home.svg b/branch-4.2/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-infoworld.svg b/branch-4.2/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.2/_static/img/icons/icon-integrations.svg b/branch-4.2/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-knowledge-base.svg b/branch-4.2/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-less.svg b/branch-4.2/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-live-test.svg b/branch-4.2/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.2/_static/img/icons/icon-mail-list.svg b/branch-4.2/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-manager.svg b/branch-4.2/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.2/_static/img/icons/icon-memory-management.svg b/branch-4.2/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.2/_static/img/icons/icon-modeling.svg b/branch-4.2/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-monitoring.svg b/branch-4.2/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.2/_static/img/icons/icon-networking.svg b/branch-4.2/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.2/_static/img/icons/icon-news.svg b/branch-4.2/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.2/_static/img/icons/icon-newsletter.svg b/branch-4.2/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.2/_static/img/icons/icon-nsql-guides.svg b/branch-4.2/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.2/_static/img/icons/icon-open-source.svg b/branch-4.2/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.2/_static/img/icons/icon-operator.svg b/branch-4.2/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-overview.svg b/branch-4.2/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.2/_static/img/icons/icon-partners.svg b/branch-4.2/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.2/_static/img/icons/icon-plus.svg b/branch-4.2/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-pricing.svg b/branch-4.2/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.2/_static/img/icons/icon-release-notes.svg b/branch-4.2/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.2/_static/img/icons/icon-resource-center.svg b/branch-4.2/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.2/_static/img/icons/icon-roadmap.svg b/branch-4.2/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.2/_static/img/icons/icon-search.svg b/branch-4.2/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.2/_static/img/icons/icon-slack.svg b/branch-4.2/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-stack-overflow.svg b/branch-4.2/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.2/_static/img/icons/icon-summit.svg b/branch-4.2/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-support.svg b/branch-4.2/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.2/_static/img/icons/icon-tech-talks.svg b/branch-4.2/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.2/_static/img/icons/icon-testing.svg b/branch-4.2/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.2/_static/img/icons/icon-thumbs-down.svg b/branch-4.2/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-thumbs-up.svg b/branch-4.2/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-tip.svg b/branch-4.2/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.2/_static/img/icons/icon-training.svg b/branch-4.2/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.2/_static/img/icons/icon-triangle-down.svg b/branch-4.2/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.2/_static/img/icons/icon-university.svg b/branch-4.2/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.2/_static/img/icons/icon-users-blog.svg b/branch-4.2/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.2/_static/img/icons/icon-warning.svg b/branch-4.2/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-webinars.svg b/branch-4.2/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.2/_static/img/icons/icon-whitepapers.svg b/branch-4.2/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.2/_static/img/icons/icon-workshop.svg b/branch-4.2/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/logo-docs.svg b/branch-4.2/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.2/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.2/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.2/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.2/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.2/_static/img/mascots/404.jpg b/branch-4.2/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.2/_static/img/mascots/404.jpg differ diff --git a/branch-4.2/_static/img/mascots/scylla-3monsters.png b/branch-4.2/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.2/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-alternator.svg b/branch-4.2/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.2/_static/img/mascots/scylla-cloud.svg b/branch-4.2/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.2/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.2/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-computer-headset.png b/branch-4.2/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-cup-number-one.png b/branch-4.2/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-docs.svg b/branch-4.2/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.2/_static/img/mascots/scylla-drivers.svg b/branch-4.2/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.2/_static/img/mascots/scylla-enterprise.svg b/branch-4.2/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.2/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.2/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-forklift-migration.png b/branch-4.2/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-gear.png b/branch-4.2/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-hardhat.png b/branch-4.2/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-headband.png b/branch-4.2/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-headset.png b/branch-4.2/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-hearts.png b/branch-4.2/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-looking-down.png b/branch-4.2/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-looking-up.png b/branch-4.2/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.2/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.2/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-manager.svg b/branch-4.2/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.2/_static/img/mascots/scylla-monitor.svg b/branch-4.2/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.2/_static/img/mascots/scylla-movement-fast.png b/branch-4.2/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-movement.png b/branch-4.2/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-onpremise.png b/branch-4.2/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-opensource.svg b/branch-4.2/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.2/_static/img/mascots/scylla-operator.svg b/branch-4.2/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.2/_static/img/mascots/scylla-plugin.png b/branch-4.2/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-release-mascot.png b/branch-4.2/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-repair.png b/branch-4.2/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-server.png b/branch-4.2/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-sleeping.png b/branch-4.2/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-tall-measure.png b/branch-4.2/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-university.png b/branch-4.2/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-weights.png b/branch-4.2/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-window-cleaning.png b/branch-4.2/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-with-computer-2.png b/branch-4.2/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-with-computer.png b/branch-4.2/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-with-linux.png b/branch-4.2/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-writting.png b/branch-4.2/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.2/_static/img/menu.svg b/branch-4.2/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.2/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.2/_static/img/scylla-monitor.png b/branch-4.2/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.2/_static/img/scylla-monitor.png differ diff --git a/branch-4.2/_static/js/main.bundle.js b/branch-4.2/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-4.2/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
                    • Back
                    • ',backButtonPosition:"top",wrapper:"
                      ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                        "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                        ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                        ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                        ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                        ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                        "],col:[2,"","
                        "],tr:[2,"","
                        "],td:[3,"","
                        "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + + + +
                        + + + + + +
                        + + +
                        + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/index.html b/branch-4.2/index.html new file mode 100644 index 000000000..1fc92e49f --- /dev/null +++ b/branch-4.2/index.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        ScyllaDB Monitoring Stack

                        +
                        +
                        +

                        ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                        +_images/monitor.png +

                        The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                        +
                          +
                        • prometheus - collects and stores metrics

                        • +
                        • alertmanager - handles alerts

                        • +
                        • grafana - dashboard server

                        • +
                        +

                        Choose a topic to get started:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/docker_compose.html b/branch-4.2/install/docker_compose.html new file mode 100644 index 000000000..66c4bcb16 --- /dev/null +++ b/branch-4.2/install/docker_compose.html @@ -0,0 +1,825 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Using Docker Compose

                        +

                        Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                        +

                        Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                        +
                        +

                        Warning

                        +

                        docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                        +
                        +
                        +

                        Prerequisite

                        +

                        Make sure you have docker and docker-compose installed.

                        +
                        +
                        +

                        Setting Prometheus

                        +

                        The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                        +

                        You can use ./prometheus-config.sh to generate the file, for example:

                        +
                        ./prometheus-config.sh --compose
                        +
                        +
                        +

                        For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                        +
                        +
                        +

                        Setting Grafana Provisioning

                        +

                        Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                        +
                        +

                        Grafana Data-Source file

                        +

                        Run the following command to update the datasource:

                        +
                        ./grafana-datasource.sh --compose
                        +
                        +
                        +

                        You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                        +
                        +
                        +

                        Grafana Dashboard Load file

                        +

                        To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                        +
                        ./generate-dashboards.sh -t -v 2020.1
                        +
                        +
                        +

                        This command generates the files under: grafana/provisioning/dashboards/

                        +
                        +
                        +
                        +

                        Docker Compose file

                        +

                        You can use the following example as a base for your docker compose.

                        +

                        Pass the following to a file called docker-compose.yml

                        +
                        services:
                        +  alertmanager:
                        +    container_name: aalert
                        +    image: prom/alertmanager:v0.21.0
                        +    ports:
                        +    - 9093:9093
                        +    volumes:
                        +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                        +  grafana:
                        +    container_name: agraf
                        +    environment:
                        +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                        +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                        +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                        +    # This is where you set Grafana security
                        +    - GF_AUTH_BASIC_ENABLED=false
                        +    - GF_AUTH_ANONYMOUS_ENABLED=true
                        +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                        +    - GF_SECURITY_ADMIN_PASSWORD=admin
                        +    image: grafana/grafana:7.3.5
                        +    ports:
                        +    - 3000:3000
                        +    user: 1000:1000
                        +    volumes:
                        +    - ./grafana/build:/var/lib/grafana/dashboards
                        +    - ./grafana/plugins:/var/lib/grafana/plugins
                        +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                        +    # Uncomment the following line for grafana persistency
                        +    # - path/to/grafana/dir:/var/lib/grafana
                        +  loki:
                        +    command:
                        +    - --config.file=/mnt/config/loki-config.yaml
                        +    container_name: loki
                        +    image: grafana/loki:2.0.0
                        +    ports:
                        +    - 3100:3100
                        +    volumes:
                        +    - ./loki/rules:/etc/loki/rules
                        +    - ./loki/conf:/mnt/config
                        +  promotheus:
                        +    command:
                        +    - --config.file=/etc/prometheus/prometheus.compose.yml
                        +    container_name: aprom
                        +    image: prom/prometheus:v2.18.1
                        +    ports:
                        +    - 9090:9090
                        +    volumes:
                        +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                        +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                        +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                        +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                        +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                        +    # Uncomment the following line for prometheus persistency 
                        +    # - path/to/data/dir:/prometheus/data
                        +  promtail:
                        +    command:
                        +    - --config.file=/etc/promtail/config.yml
                        +    container_name: promtail
                        +    image: grafana/promtail:2.0.0
                        +    ports:
                        +    - 1514:1514
                        +    - 9080:9080
                        +    volumes:
                        +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                        +version: '3'
                        +
                        +
                        +
                        +

                        Start and Stop

                        +

                        To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/index.html b/branch-4.2/install/index.html new file mode 100644 index 000000000..38baf4fb2 --- /dev/null +++ b/branch-4.2/install/index.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Download and Install Scylla Monitoring Stack

                        +
                        +
                        +

                        Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                        +

                        Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/min-prod-hw.html b/branch-4.2/install/min-prod-hw.html new file mode 100644 index 000000000..45beb1113 --- /dev/null +++ b/branch-4.2/install/min-prod-hw.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Minimal Production System Recommendations

                        +
                          +
                        • CPU - at least 2 physical cores/ 4vCPUs

                        • +
                        • Memory - 15GB+ DRAM and proportional to the number of cores.

                        • +
                        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                        • +
                        • Network - 1GbE/10GbE preferred

                        • +
                        +
                        +

                        Calculating Prometheus Minimal Disk Space requirement

                        +

                        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                        +

                        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                        +

                        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                        +
                        6 * 16 * 15 * 12MB ~ 16GB
                        +
                        +
                        +

                        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                        +
                        +
                        +

                        Calculating Prometheus Minimal Memory Space requirement

                        +

                        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                        +

                        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                        + +
                        + +++++++ + + + +
                        # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                        00
                        + +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/monitor_without_docker.html b/branch-4.2/install/monitor_without_docker.html new file mode 100644 index 000000000..d124c0096 --- /dev/null +++ b/branch-4.2/install/monitor_without_docker.html @@ -0,0 +1,1170 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Deploying Scylla Monitoring Stack Without Docker

                        +
                        +

                        Introduction

                        +

                        The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                        +

                        Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                        +

                        Scylla Monitoring uses the following components:

                        +
                          +
                        • Alertmanager

                        • +
                        • Grafana Loki

                        • +
                        • Prometheus

                        • +
                        • Grafana

                        • +
                        +

                        The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                        +

                        We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                        +
                        +
                        +

                        Minimal Production System Recommendations

                        +
                          +
                        • CPU - at least 2 physical cores/ 4vCPUs

                        • +
                        • Memory - 15GB+ DRAM and proportional to the number of cores.

                        • +
                        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                        • +
                        • Network - 1GbE/10GbE preferred

                        • +
                        +
                        +

                        Calculating Prometheus Minimal Disk Space requirement

                        +

                        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                        +

                        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                        +

                        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                        +
                        6 * 16 * 15 * 12MB ~ 16GB
                        +
                        +
                        +

                        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                        +
                        +
                        +

                        Calculating Prometheus Minimal Memory Space requirement

                        +

                        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                        +

                        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                        + +
                        + +++++++ + + + +
                        # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                        00
                        + +
                        +

                        The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                        +
                        +

                        Note

                        +

                        Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                        +
                        +
                        +
                        +
                        +

                        Install Scylla Monitoring Stack

                        +

                        The following procedure uses a CentOS 7 based instance

                        +
                          +
                        1. Download the latest Scylla Monitoring Stack release.

                        2. +
                        +
                        wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.2.1.tar.gz
                        +
                        +
                        +
                          +
                        1. Open the tar

                        2. +
                        +

                        tar -xvf scylla-monitoring-*.tar.gz

                        +
                        +
                        +

                        Install Alertmanager

                        +

                        Tested with alertmanager 0.22.2 version

                        +
                          +
                        1. Install alertmanager

                        2. +
                        +
                        wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                        +tar -xvf alertmanager-*.linux-amd64.tar.gz
                        +
                        +
                        +
                          +
                        1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                        2. +
                        +

                        For example:

                        +
                        cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.2.1/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                        +
                        +
                        +
                          +
                        1. Start the Alertmanager

                        2. +
                        +

                        For example:

                        +
                        cd alertmanager-0.22.2.linux-amd64
                        +./alertmanager
                        +
                        +
                        +
                          +
                        1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                        2. +
                        +

                        For example:

                        +
                        http://192.168.135.166:9093/
                        +
                        +
                        +../_images/alertmanager.png +
                        +
                        +

                        Install Grafana Loki

                        +

                        Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                        +

                        We recomand using Loki with containers, but you can install it locally as described in Loki installation

                        +

                        You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                        +

                        Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                        +

                        Loki Related files

                        +

                        Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                        +
                        mkdir -p /etc/loki/rules
                        +mkdir -p /etc/loki/config
                        +cp loki/rules/* /etc/loki/rules
                        +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                        +
                        +
                        +

                        Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                        +

                        Promtail Related files

                        +

                        Promtail has a configuration file. You need to copy and modify the configuration.

                        +
                        mkdir -p /etc/promtail/
                        +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                        +
                        +
                        +

                        Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                        +
                        +
                        +

                        Install Prometheus

                        +

                        Tested with Prometheus version 2.27.1

                        +
                        +

                        Note

                        +

                        If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                        +
                        +
                          +
                        1. Install Prometheus

                        2. +
                        +
                        wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                        +tar -xvf prometheus-*.linux-amd64.tar.gz
                        +
                        +
                        +

                        2. Create Data and Config directories +.. code-block:: shell

                        +
                        +

                        mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                        +
                        +
                          +
                        1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                        2. +
                        +

                        Copy prometheus/prometheus.yml.template to prometheus.yml

                        +

                        For example:

                        +
                        cp scylla-monitoring-scylla-monitoring-4.2.1/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/
                        +cp scylla-monitoring-scylla-monitoring-4.2.1/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                        +
                        +
                        +
                          +
                        1. Edit the prometheus.yml file to point to the correct static data sources.

                        2. +
                        +
                        +

                        Note

                        +

                        Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                        +
                        +
                        vi /etc/prometheus/prometheus.yml
                        +
                        +
                        +

                        Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                        +

                        For example if the alertmanager will run on the same host:

                        +
                        alerting:
                        +   alertmanagers:
                        +   - static_configs:
                        +       - targets:
                        +           - 127.0.0.1:9093
                        +
                        +
                        +

                        Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                        +

                        For example the scrape config for Scylla:

                        +
                        global:
                        +  scrape_interval: 5s # By default, scrape targets every 5 second.
                        +  scrape_timeout: 4s # Timeout before trying to scape a target again
                        +
                        +  # Attach these labels to any time series or alerts when communicating with
                        +  # external systems (federation, remote storage, Alertmanager).
                        +  external_labels:
                        +    monitor: 'scylla-monitor'
                        +
                        +scrape_configs:
                        +- job_name: scylla
                        +  honor_labels: false
                        +  file_sd_configs:
                        +    - files:
                        +      - /etc/scylla.d/prometheus/scylla_servers.yml
                        +  relabel_configs:
                        +    - source_labels: [__address__]
                        +      regex:  '([^:]+)'
                        +      target_label: __address__
                        +      replacement: '${1}:9180'
                        +
                        +    - source_labels: [__address__]
                        +      regex:  '(.*):.+'
                        +      target_label: instance
                        +      replacement: '${1}'
                        +
                        +
                        +
                          +
                        1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                        2. +
                        +
                        +

                        Note

                        +

                        There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                        +
                        +

                        An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                        +
                        +

                        Note

                        +

                        You must have both files even if you are not using Scylla Manager

                        +
                        +

                        Add the labels for the cluster and data-center

                        +

                        scylla_servers.yml:

                        +

                        For example:

                        +
                        cat scylla_servers.yml
                        +# List Scylla end points
                        +
                        +- targets:
                        +  - 192.168.66.6
                        +  - 192.168.66.244
                        +  labels:
                        +    cluster: cluster1
                        +    dc: dc1
                        +- targets:
                        +    - 172.17.0.3
                        +  labels:
                        +    cluster: cluster1
                        +    dc: dc2
                        +
                        +
                        +
                        +

                        Note

                        +

                        See the previous note about deprecating the node_exporter_servers.yml file.

                        +
                        +

                        scylla_manager_server.yml

                        +

                        For example:

                        +
                        - targets:
                        +  - 127.0.0.1:5090
                        +
                        +
                        +
                          +
                        1. Start Prometheus server:

                        2. +
                        +

                        For example:

                        +
                        cd scylla-monitoring-scylla-monitoring-4.2.1/
                        +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                        +
                        +
                        +

                        Data should start accumulate on: /prometheus/data

                        +
                          +
                        1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                        2. +
                        +

                        For example:

                        +
                        http://192.168.135.166:9090/
                        +
                        +
                        +../_images/1.png +

                        Prometheus console should be visible

                        +
                          +
                        1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                        2. +
                        +

                        For example:

                        +

                        node_memory_MemFree

                        +../_images/2.png +

                        And

                        +

                        scylla_reactor_utilization

                        +../_images/3.png +

                        At this point Scylla is emitting the metrics and Prometheus is able to store them.

                        +
                        +
                        +

                        Install Grafana

                        +

                        Tested with Grafna 7.5.7

                        +
                          +
                        1. Install Grafana based on the instructions here

                        2. +
                        +

                        Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                        +
                          +
                        1. Access Scylla-Grafana-monitoring directory

                        2. +
                        +
                        cd scylla-monitoring-scylla-monitoring-4.2.1/
                        +
                        +
                        +
                          +
                        1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                        2. +
                        +
                        sudo cp -r grafana/plugins /var/lib/grafana/
                        +
                        +
                        +

                        If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                        +

                        For example:

                        +
                        cp -r grafana/plugins ../grafana-7.5.7/public/app
                        +
                        +
                        +
                          +
                        1. Provision the Dashboards

                        2. +
                        +

                        For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                        +

                        For Grafana installed with yum install

                        +
                        sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                        +sudo mkdir -p /var/lib/grafana/dashboards
                        +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                        +
                        +
                        +

                        For Grafana installed from packages

                        +
                        cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                        +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                        +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                        +
                        +
                        +

                        Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                        +
                        +

                        Note

                        +

                        A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                        +
                        +
                          +
                        1. Set the data source by copy datasource.yml and edit it

                        2. +
                        +
                        sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                        +
                        +
                        +
                        +

                        Note

                        +

                        Scylla uses a plugin to read from some system tables see the section below about using it.

                        +
                        +

                        For Grafana installed from packages

                        +
                        cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                        +
                        +
                        +

                        You should set the Prometheus and the alertmanager IP and port.

                        +

                        For example

                        +
                        sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                        +apiVersion: 1
                        +datasources:
                        + - name: prometheus
                        +   type: prometheus
                        +   url: http://192.168.135.167:9090
                        +   access: proxy
                        +   basicAuth: false
                        +
                        + - name: alertmanager
                        +   type: camptocamp-prometheus-alertmanager-datasource
                        +   orgId: 1
                        +   typeLogoUrl: public/img/icn-datasource.svg
                        +   access: proxy
                        +   url: http://192.168.135.166:9093
                        +   password:
                        +   user:
                        +   database:
                        +   basicAuth:
                        +   isDefault:
                        +   jsonData:
                        +     severity_critical: '4'
                        +     severity_high: '3'
                        +     severity_warning: '2'
                        +     severity_info: '1'
                        +
                        +
                        +
                          +
                        1. Start the Grafana service

                        2. +
                        +

                        For Grafana installed with yum install

                        +

                        sudo service grafana-server start

                        +

                        For Grafana installed from packages:

                        +

                        cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                        +

                        Edit scylla.ini to reflect the right paths in the paths section of the file.

                        +
                        plugins = /home/centos/grafana-7.5.7/data/plugins
                        +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                        +
                        +
                        +

                        Start the server:

                        +
                        cd /home/centos/grafana-7.5.7/
                        +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                        +
                        +
                        +
                          +
                        1. Make sure Grafana is running

                        2. +
                        +

                        Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                        +../_images/grafana.png +
                        +
                        +

                        Using Scylla Plugin with Grafana

                        +

                        Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                        +

                        Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                        +
                        +

                        Setting a monitoring user

                        +

                        This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                        +
                          +
                        • If you have not done so, enable authorization first.

                        • +
                        • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                        • +
                        • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                        • +
                        +
                        +
                        +

                        Installing the Plugin

                        +

                        Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                        +
                        +
                        +

                        Configure the Plugin

                        +

                        Add an entry to the datasource.yml file

                        +
                        - name: scylla-datasource
                        +  type: scylladb-scylla-datasource
                        +  orgId: 1
                        +  isDefault:
                        +  jsonData:
                        +  host: ''
                        +#  secureJsonData:
                        +#    user: 'scylla_monitoring'
                        +#    password: 'scylla_monitoring'
                        +
                        +
                        +

                        As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                        +
                        +
                        +

                        Enable the Plugin

                        +

                        Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                        +

                        See more about it the Grafana configurtion.

                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/monitoring_stack.html b/branch-4.2/install/monitoring_stack.html new file mode 100644 index 000000000..429611e90 --- /dev/null +++ b/branch-4.2/install/monitoring_stack.html @@ -0,0 +1,1096 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Install Scylla Monitoring Stack

                        +

                        This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API

                        +

                        The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                        +

                        For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                        +
                        +

                        Minimal Production System Recommendations

                        +
                          +
                        • CPU - at least 2 physical cores/ 4vCPUs

                        • +
                        • Memory - 15GB+ DRAM and proportional to the number of cores.

                        • +
                        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                        • +
                        • Network - 1GbE/10GbE preferred

                        • +
                        +
                        +

                        Calculating Prometheus Minimal Disk Space requirement

                        +

                        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                        +

                        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                        +

                        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                        +
                        6 * 16 * 15 * 12MB ~ 16GB
                        +
                        +
                        +

                        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                        +
                        +
                        +

                        Calculating Prometheus Minimal Memory Space requirement

                        +

                        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                        +

                        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                        + +
                        + +++++++ + + + +
                        # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                        00
                        + +
                        +
                        +
                        +
                        +

                        Prerequisites

                        +
                          +
                        • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                        • +
                        • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                        • +
                        + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        Scylla Monitoring Stack Compatibility Matrix

                        Scylla Monitoring Stack Version

                        Prometheus Version

                        Grafana Version

                        4.2

                        2.41.0

                        9.3.4

                        4.1

                        2.38.0

                        9.1.0

                        4.0

                        2.34.0

                        8.5.2

                        3.11

                        2.32.0

                        8.3.4

                        3.10

                        2.32.0

                        8.3.3

                        3.9.2

                        2.29.1

                        8.2.7

                        3.9

                        2.29.1

                        8.1.1

                        3.8

                        2.27.1

                        7.5.7

                        3.7

                        2.25.2

                        7.4.0

                        3.6

                        2.18.1

                        7.3.5

                        3.5

                        2.18.1

                        7.1.5

                        3.4

                        2.18.1

                        6.7.3

                        +
                        +
                        +

                        Docker Post Installation

                        +

                        Docker post installation guide can be found here

                        +
                        +

                        Note

                        +

                        Avoid running the container as root.

                        +
                        +

                        To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                        +
                          +
                        1. Create the Docker group.

                        2. +
                        +
                        sudo groupadd docker
                        +
                        +
                        +
                          +
                        1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                        2. +
                        +
                        sudo usermod -aG docker $USER
                        +
                        +
                        +
                          +
                        1. Start Docker by calling:

                        2. +
                        +
                        sudo systemctl enable docker
                        +
                        +
                        +
                        +
                        +

                        Install Scylla Monitoring Stack

                        +

                        Procedure

                        +
                          +
                        1. Download and extract the latest Scylla Monitoring Stack binary;.

                        2. +
                        +
                        wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.2.1.tar.gz
                        +tar -xvf scylla-monitoring-4.2.1.tar.gz
                        +cd scylla-monitoring-scylla-monitoring-4.2.1
                        +
                        +
                        +

                        As an alternative, you can clone and use the Git repository directly.

                        +
                        git clone https://github.com/scylladb/scylla-monitoring.git
                        +cd scylla-monitoring
                        +git checkout branch-4.2
                        +
                        +
                        +
                          +
                        1. Start Docker service if needed

                        2. +
                        +
                        sudo systemctl restart docker
                        +
                        +
                        +
                        +
                        +

                        Configure Scylla Monitoring Stack

                        +

                        To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                        +

                        This configuration can be done from files, or using the Consul api.

                        +

                        Scylla Manager 2.0 and higher supports the Consul API.

                        +
                        +

                        Configure Scylla nodes from files

                        +
                          +
                        1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                        2. +
                        +
                        +

                        Note

                        +

                        It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                        +
                        +

                        For example:

                        +
                        - targets:
                        +      - 172.17.0.2
                        +      - 172.17.0.3
                        +  labels:
                        +      cluster: cluster1
                        +      dc: dc1
                        +
                        +
                        +
                        +

                        Note

                        +

                        If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                        +
                        +

                        Using IPV6

                        +

                        To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                        +

                        For example:

                        +
                        - targets:
                        +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                        +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                        +  labels:
                        +      cluster: cluster1
                        +      dc: dc1
                        +
                        +
                        +
                        +

                        Note

                        +

                        For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                        +
                        +

                        For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                        +
                        +

                        Note

                        +

                        By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                        +
                        +

                        If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                        +

                        For example:

                        +
                        ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                        +
                        +
                        +

                        Mark the different Data Centers with Labels.

                        +

                        As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                        +

                        You can use the genconfig.py script to generate the server file. For example:

                        +
                        ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                        +
                        +
                        +

                        This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                        +

                        OR

                        +

                        The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                        +
                        nodetool status | ./genconfig.py -NS
                        +
                        +
                        +

                        2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                        +

                        You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                        +

                        For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                        +
                        # List Scylla Manager end points
                        +
                        +- targets:
                        +  - 172.17.0.7:5090
                        +
                        +
                        +

                        Note that you do not need to add labels to the Scylla Manager targets.

                        +
                        +
                        +

                        Configure Scylla nodes using Scylla-Manager Consul API

                        +

                        Scylla Manager 2.0 has a Consul like API.

                        +

                        When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                        +

                        For example:

                        +
                        ./start-all.sh -L 10.10.0.1
                        +
                        +
                        +
                        +

                        Note

                        +

                        If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                        +
                        +
                        +
                        +

                        Connecting Scylla-Monitoring to Scylla

                        +

                        Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                        +

                        You can limit the user to read only, currently it only read table from the system keyspace.

                        +

                        To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

                        +

                        Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

                        +
                        +
                        +

                        Use an external directory for the Prometheus data directory

                        +

                        The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                        +
                        +

                        Note

                        +

                        Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                        +
                        +

                        If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                        +

                        In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                        +
                        +
                        +

                        Add Additional Prometheus Targets

                        +

                        There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                        +

                        The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                        +

                        You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                        +
                        - job_name: 'myservice'
                        +  # Override the global default and scrape targets from this job every 5 seconds.
                        +  scrape_interval: 5s
                        +  static_configs:
                        +    - targets:
                        +      - 17.0.0.1:7000
                        +
                        +
                        +
                        +
                        +
                        +

                        Start and Stop Scylla Monitoring Stack

                        +
                        +

                        Start

                        +
                        ./start-all.sh -d prometheus_data
                        +
                        +
                        +
                        +
                        +

                        Stop

                        +
                        ./kill-all.sh
                        +
                        +
                        +
                        +
                        +

                        Start a Specific Scylla Monitoring Stack Version

                        +

                        By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                        +

                        You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                        +

                        Multiple versions are supported. For example:

                        +
                        ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                        +
                        +
                        +

                        will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                        +
                        +
                        +

                        Accessing the localhost

                        +

                        The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                        +
                        ./start-all.sh -l -d prometheus-data
                        +
                        +
                        +
                        +
                        +

                        Configure rsyslog on each Scylla node

                        +

                        generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                        +

                        Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                        +

                        Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                        +

                        If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                        +
                        if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                        +
                        +
                        +

                        Restart rsyslog for the configuration to take effect.

                        +
                        systemctl restart rsyslog
                        +
                        +
                        +
                        +
                        +
                        +

                        View Grafana Dashboards

                        +

                        Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/start_all.html b/branch-4.2/install/start_all.html new file mode 100644 index 000000000..b20c7ab73 --- /dev/null +++ b/branch-4.2/install/start_all.html @@ -0,0 +1,765 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        The start-all.sh Command

                        +

                        Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                        +

                        The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                        +
                        +

                        General Options

                        +

                        -h Help, Print the help, and exit.

                        +

                        –version print the current Scylla-Monitoring stack version, and exit.

                        +

                        -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                        +

                        -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                        +

                        -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                        +

                        –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                        +
                        + + +
                        +

                        Alert Manager

                        +

                        The Alertmanager handles the alerts and takes the following parameters:

                        +

                        -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                        +

                        -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                        +

                        -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/thanos.html b/branch-4.2/install/thanos.html new file mode 100644 index 000000000..7ba0d2f7f --- /dev/null +++ b/branch-4.2/install/thanos.html @@ -0,0 +1,768 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Using Thanos as Data Source With Scylla Monitoring Stack

                        +

                        Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                        +
                          +
                        • High-availability.

                        • +
                        • Horizontal scaling.

                        • +
                        • Backup.

                        • +
                        +

                        The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                        +

                        The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                        +
                        +

                        Using Thanos As a Prometheus Aggregator

                        +

                        There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                        +
                        +

                        Prometheus Configuration

                        +

                        We will assume you have two Prometheus servers running.

                        +
                          +
                        1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                        2. +
                        3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                        4. +
                        +
                        +
                        +

                        Thanos sidecar

                        +

                        The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                        +
                        docker run -d \
                        + -v /path/to/prom/dir:/data/prom:z \
                        + -i --name sidecar thanosio/thanos \
                        + sidecar \
                        + --grpc-address=0.0.0.0:10911 \
                        + --grpc-grace-period=1s \
                        + --http-address=0.0.0.0:10912 \
                        + --http-grace-period=1s \
                        + --prometheus.url=http://prometheus-ip:9090 \
                        + --tsdb.path=/data/prom \
                        + -p 10912:10912 \
                        + -p 10911:10911
                        +
                        +
                        +

                        After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                        +
                        +
                        +

                        Thanos query

                        +

                        Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                        +
                        docker run -d \
                        + --name thanos -- thanosio/thanos \
                        +   query \
                        +   --debug.name=query0 \
                        +   --log.level=debug \
                        +   --grpc-address=0.0.0.0:10903 \
                        +   --grpc-grace-period=1s \
                        +   --http-address=0.0.0.0:10904 \
                        +   --http-grace-period=1s \
                        +   --query.replica-label=prometheus \
                        +   --store={ip1}:10911 --store={ip2}:10911
                        +
                        +
                        +

                        After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                        +
                        +
                        +

                        Update Scylla Data source

                        +

                        The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                        +

                        The file you edit is a template file that replaces the file Grafana uses, next time you start.

                        +

                        Restart the Scylla Monitoring Stack it should now use Thanos.

                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/intro.html b/branch-4.2/intro.html new file mode 100644 index 000000000..01a295380 --- /dev/null +++ b/branch-4.2/intro.html @@ -0,0 +1,717 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        ScyllaDB Monitoring Stack

                        +

                        ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                        +_images/monitor.png +

                        The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                        +
                          +
                        • prometheus - Collects and stores metrics

                        • +
                        • grafan-loki - Parses logs and generates metrics and alerts

                        • +
                        • alertmanager - Handles alerts

                        • +
                        • grafana - Dashboards server

                        • +
                        +

                        A few optional components are used for additional services

                        +
                          +
                        • grafana-image-renderer - Allows you to download a dashboard as an image.

                        • +
                        • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                        • +
                        +
                        +

                        High Level Architecture

                        +_images/monitoring_stack1.png +

                        We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                        +

                        We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                        +

                        The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                        +

                        We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                        +

                        Choose a topic to get started:

                        + +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/objects.inv b/branch-4.2/objects.inv new file mode 100644 index 000000000..4824b5791 Binary files /dev/null and b/branch-4.2/objects.inv differ diff --git a/branch-4.2/procedures/alerts/alerting.html b/branch-4.2/procedures/alerts/alerting.html new file mode 100644 index 000000000..dca769b71 --- /dev/null +++ b/branch-4.2/procedures/alerts/alerting.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Alerting

                        +

                        Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                        +

                        You can read more about Prometheus alerting here

                        +

                        By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                        +

                        In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                        +

                        The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                        +../../_images/monitoring_stack.png +
                        +

                        Prometheus Alerts

                        +

                        The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                        +

                        Each alert consists of:

                        +
                          +
                        • Name

                        • +
                        • What happened

                        • +
                        • For how long

                        • +
                        • What to report

                        • +
                        +

                        For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                        +
                        - alert: InstanceDown
                        +  expr: up == 0
                        +  for: 60s
                        +  labels:
                        +    severity: "2"
                        +  annotations:
                        +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                        +    summary: Instance {{ $labels.instance }} down
                        +
                        +
                        +

                        The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                        +

                        The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                        +

                        The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                        +

                        annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                        +
                        +
                        +

                        Alertmanager

                        +

                        The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                        +

                        The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                        +
                          +
                        • Routes: Represent a routing tree, the most specific rule, wins

                        • +
                        • Inhibition: Mute an alert, based on another alert

                        • +
                        • Receiver: Send a notification via email, sluck, etc’

                        • +
                        +

                        Check the Alertmanager documentation for details on how to specify a specific receiver.

                        +

                        In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                        +
                        +
                        +

                        Tips When Adding an Alert

                        +

                        It’s worse having an alert that does not work, than not having an alert at all

                        +

                        There are multiple ways you can use to make sure your alert is set correctly:

                        +
                          +
                        • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                        • +
                        • Force the alert to be active by reducing the limits or the duration.

                        • +
                        • When possible simulate the actual scenario and see that the alert works as expected.

                        • +
                        +

                        For example, low available disk space.

                        +

                        Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                        +

                        Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                        +

                        Starting with a simple working expression helps you bisect problems.

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/procedures/alerts/index.html b/branch-4.2/procedures/alerts/index.html new file mode 100644 index 000000000..1b108b94f --- /dev/null +++ b/branch-4.2/procedures/alerts/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Stack Alert Manager

                        +
                        +
                        +

                        Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/procedures/datadog/index.html b/branch-4.2/procedures/datadog/index.html new file mode 100644 index 000000000..be8249819 --- /dev/null +++ b/branch-4.2/procedures/datadog/index.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Datadog Integration

                        +

                        The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                        +
                          +
                        1. Installing and configuring the Datadog Agent.

                        2. +
                        3. Add datadog recording rules.

                        4. +
                        5. Loading Scylla dashboard to Datadog.

                        6. +
                        7. Optionally load Monitor (Alerts).

                        8. +
                        +
                        +

                        Note

                        +

                        Scylla Cloud users, use and update the proper configuration file.

                        +
                        +
                        +

                        Install And configure the Datadog Agent

                        +

                        Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                        +

                        Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                        +
                        +

                        Scylla Cloud Users

                        +

                        Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                        +

                        Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                        +
                        +
                        +

                        Other Scylla Users

                        +

                        Other Scylla users, download the configuration file conf.yaml and replace the ip address of the promemtheus server.

                        +
                        +
                        +

                        Post configuration

                        +

                        Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                        +
                        +
                        +
                        +

                        Add datadog recording rules

                        +

                        Non cloud users, download the rules configuration file datadog.rules.yml and place it under prometheus/prom_rules/.

                        +
                        +
                        +

                        Upload the Dashboard

                        +

                        Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                        +
                        +
                        +

                        Using the Dashboard

                        +

                        We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                        +../../_images/datadog.png +

                        The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                        +
                        +

                        Note

                        +

                        Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                        +
                        +
                        +
                        +

                        Adding Monitor

                        +

                        Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/procedures/index.html b/branch-4.2/procedures/index.html new file mode 100644 index 000000000..10f22aa1a --- /dev/null +++ b/branch-4.2/procedures/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        ScyllaDB Monitoring Stack Procedures

                        +
                        +
                        +

                        There are several reference guides available which give additional information. Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/procedures/updating_dashboard.html b/branch-4.2/procedures/updating_dashboard.html new file mode 100644 index 000000000..bd575e313 --- /dev/null +++ b/branch-4.2/procedures/updating_dashboard.html @@ -0,0 +1,973 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Adding and Modifying Dashboards

                        +

                        This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                        +

                        It covers dashboard templates and how to modify them.

                        + +
                        +

                        General Limitations

                        +

                        Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                        +
                        +

                        Consistency Between Restarts

                        +

                        By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                        +
                        +
                        +

                        Consistency Between Upgrades

                        +

                        As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                        +
                        +

                        Note

                        +

                         You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                        +
                        +

                        At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                        +
                        +
                        +
                        +

                        Using Templated Dashboards

                        +

                        Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                        +

                        Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                        +

                        For example a typical graph panel would look like this:

                        +
                        {
                        +    "aliasColors": {},
                        +    "bars": false,
                        +    "datasource": "prometheus",
                        +    "editable": true,
                        +    "error": false,
                        +    "fill": 0,
                        +    "grid": {
                        +        "threshold1": null,
                        +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                        +        "threshold2": null,
                        +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                        +    },
                        +    "gridPos": {
                        +        "h": 6,
                        +        "w": 10,
                        +        "x": 0,
                        +        "y": 4
                        +    },
                        +    "id": 2,
                        +    "isNew": true,
                        +    "legend": {
                        +        "avg": false,
                        +        "current": false,
                        +        "max": false,
                        +        "min": false,
                        +        "show": false,
                        +        "total": false,
                        +        "values": false
                        +    },
                        +    "lines": true,
                        +    "linewidth": 2,
                        +    "links": [],
                        +    "nullPointMode": "connected",
                        +    "percentage": false,
                        +    "pointradius": 5,
                        +    "points": false,
                        +    "renderer": "flot",
                        +    "seriesOverrides": [
                        +        {}
                        +    ],
                        +    "span": 5,
                        +    "stack": false,
                        +    "steppedLine": false,
                        +    "targets": [
                        +        {
                        +            "expr": "sum(node_filesystem_avail) by (instance)",
                        +            "intervalFactor": 1,
                        +            "legendFormat": "",
                        +            "refId": "A",
                        +            "step": 1
                        +        }
                        +    ],
                        +    "timeFrom": null,
                        +    "timeShift": null,
                        +    "title": "Available Disk Size",
                        +    "tooltip": {
                        +        "msResolution": false,
                        +        "shared": true,
                        +        "sort": 0,
                        +        "value_type": "cumulative"
                        +    },
                        +    "transparent": false,
                        +    "type": "graph",
                        +    "xaxis": {
                        +        "show": true
                        +    },
                        +    "yaxes": [
                        +        {
                        +            "format": "percent",
                        +            "logBase": 1,
                        +            "max": 101,
                        +            "min": 0,
                        +            "show": true
                        +        },
                        +        {
                        +            "format": "short",
                        +            "logBase": 1,
                        +            "max": null,
                        +            "min": null,
                        +            "show": true
                        +        }
                        +    ]
                        +}
                        +
                        +
                        +

                        As you can imagine, most panels would have similar values.

                        +

                        To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                        +
                        +

                        The Template Class System

                        +

                        The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                        +

                        The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                        +

                        In the template file, you can also add or override attributes.

                        +

                        The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                        +

                        When generating dashboards, each class will be replaced by its definition.

                        +

                        For example, a row in the type.json is defined as:

                        +
                        {
                        + "base_row": {
                        +     "collapse": false,
                        +     "editable": true
                        + },
                        + "row": {
                        +     "class": "base_row",
                        +     "height": "250px"
                        + }
                        + }
                        +
                        +
                        +

                        Will be used like in a template:

                        +
                        {
                        +     "class": "row",
                        +     "height": "150px",
                        +     "panels": [
                        +     ]
                        +}
                        +
                        +
                        +

                        And the output will be:

                        +
                        {
                        +     "class": "row",
                        +     "collapse": false,
                        +     "editable": true,
                        +     "height": "150px",
                        +     "panels": [
                        +
                        +     ]
                        +}
                        +
                        +
                        +

                        We can see that the template added the panels attribute and that it overrides the height attribute.

                        +
                        +
                        +

                        Panel Example

                        +

                        Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                        +
                        {
                        +     "class": "row",
                        +     "panels": [
                        +         {
                        +             "class": "bytes_panel",
                        +             "span": 3,
                        +             "targets": [
                        +                 {
                        +                     "expr": "sum(node_filesystem_avail) by (instance)",
                        +                     "intervalFactor": 1,
                        +                     "legendFormat": "",
                        +                     "metric": "",
                        +                     "refId": "A",
                        +                     "step": 1
                        +                 }
                        +             ],
                        +             "title": "Available Disk Size"
                        +         }
                        +     ]
                        +}
                        +
                        +
                        +

                        In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                        +

                        You can also see that the span attribute is overridden to set the panel size.

                        +

                        To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                        +
                        +
                        +

                        Grafana Formats and Layouts

                        +

                        The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                        +

                        Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                        +

                        The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                        +

                        To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                        +

                        The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                        +

                        You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                        +

                        gridPos has the following attributes:

                        +
                        {
                        +   "x": 0,
                        +   "y": 0,
                        +   "w": 24,
                        +   "h": 4
                        + }
                        +
                        +
                        +

                        When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                        +
                        {
                        +   "gridPos": {
                        +      "h": 2
                        +    }
                        +}
                        +
                        +
                        +
                        +
                        +

                        Generating the dashboards from templates (generate-dashboards.sh)

                        +
                        +

                        Prerequisite

                        +

                        Python 2.7

                        +

                        make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                        +

                        Use the -h flag to get help information.

                        +

                        You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                        +

                        When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                        +

                        For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                        +

                        .\generate-dashboards.sh -v 2020.1

                        +
                        +

                        Note

                        +

                        generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                        +
                        +
                        +
                        +
                        +

                        Validation

                        +

                        After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                        +

                        Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/reference/index.html b/branch-4.2/reference/index.html new file mode 100644 index 000000000..b6a595c55 --- /dev/null +++ b/branch-4.2/reference/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Stack Reference Guide

                        +
                        +
                        +

                        There are several reference guides available which give additional information. Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/reference/matrix.html b/branch-4.2/reference/matrix.html new file mode 100644 index 000000000..9470de8f5 --- /dev/null +++ b/branch-4.2/reference/matrix.html @@ -0,0 +1,845 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Stack Support Matrix

                        +

                        The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                        + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                        Scylla Monitoring Stack Version

                        Scylla Open Source Version

                        Scylla Enterprise Version

                        Node_exporter[1] Version

                        Scylla Manager Version

                        4.3

                        5.0,5.1,5.2

                        2020.1, 2021.1, 2022.1, 2022.2

                        1.4.1

                        2.5, 2.6, 3.0

                        4.2

                        4.5,4.6,5.0,5.1

                        2020.1, 2021.1, 2022.1, 2022.2

                        1.4.1

                        2.5, 2.6, 3.0

                        4.1

                        4.5,4.6,5.0,5.1

                        2020.1, 2021.1, 2022.1, 2022.2

                        0.17

                        2.5, 2.6, 3.0

                        4.0

                        4.3, 4.4, 4.5, 4.6, 5.0

                        2020.1, 2021.1, 2022.1

                        0.17

                        2.3, 2.4, 2.5, 2.6, 3.0

                        3.11

                        4.3, 4.4, 4.5, 4.6, 5.0

                        2020.1, 2021.1, 2022.2

                        0.17

                        2.3, 2.4, 2.5, 2.6

                        3.10

                        4.3, 4.4, 4.5, 4.6

                        2020.1, 2021.1

                        0.17

                        2.3, 2.4, 2.5, 2.6

                        3.9

                        4.3, 4.4, 4.5, 4.6

                        2020.1, 2021.1

                        0.17

                        2.3, 2.4, 2.5

                        3.8

                        4.3, 4.4, 4.5

                        2020.1, 2021.1

                        0.17

                        2.3, 2.4, 2.5

                        3.7

                        4.2, 4.3, 4.4

                        2019.1, 2020.1, 2021.1

                        0.17

                        2.2, 2.3

                        3.6.3

                        4.2, 4.3, 4.4

                        2019.1, 2020.1, 2021.1

                        0.17

                        2.2, 2.3, 2.1

                        3.6

                        4.1, 4.2, 4.3

                        2019.1, 2020.1

                        0.17

                        2.1, 2.2, 2.3

                        3.6.1

                        4.1, 4.2, 4.3

                        2019.1, 2020.1

                        0.17

                        2.1, 2.2

                        3.6.1

                        4.1, 4.2, 4.3, 4.4

                        2019.1, 2020.1

                        0.17

                        2.1, 2.2

                        3.5

                        3.3, 4.0, 4.1, 4.2

                        2019.1, 2020.1

                        0.17

                        2.0, 2.1, 2.2

                        3.4.3

                        3.3, 4.0, 4.1, 4.2

                        2019.1, 2020.1

                        0.17

                        2.0, 2.1

                        3.4

                        3.3, 4.0, 4.1

                        2018.1, 2019.1

                        0.17

                        2.0, 2.1

                        3.3

                        3.1, 3.2, 3.3, 4.0

                        2018.1, 2019.1

                        0.17

                        1.4, 2.0, 2.1

                        3.2

                        3.1, 3.2, 3.3

                        2018.1, 2019.1

                        0.17

                        1.4, 2.0

                        3.1

                        2.3, 3.0, 3.1, 3.2

                        2018.1, 2019.1

                        0.17

                        1.3, 1.4, 2.0

                        3.0

                        2.3, 3.0, 3.1, 3.2

                        2018.1, 2019.1

                        0.17

                        1.3, 1.4

                        2.4

                        2.3, 3.0, 3.1

                        2018.1, 2019.1

                        0.14, 0.17

                        1.3, 1.4

                        2.3

                        2.3, 3.0

                        2018.1, 2019.1

                        0.14, 0.17

                        1.3

                        2.2

                        2.3, 3.0

                        2018.1, 2019.1

                        0.14, 0.17

                        1.3

                        2.1

                        2.3, 3.0

                        2018.1

                        0.14, 0.17

                        1.3

                        +

                        [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/reference/monitoring_apis.html b/branch-4.2/reference/monitoring_apis.html new file mode 100644 index 000000000..2d7e6c580 --- /dev/null +++ b/branch-4.2/reference/monitoring_apis.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Stack Interfaces

                        +

                        Scylla exposes two interfaces for online monitoring, as described below

                        +
                        +

                        Prometheus

                        +

                        By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                        +

                        For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                        +

                        You can change the Prometheus listening address and port in scylla.yaml file

                        +
                        # prometheus port
                        +# By default, Scylla opens prometheus API port on port 9180
                        +# setting the port to 0 will disable the prometheus API.
                        +prometheus_port: 9180
                        +#
                        +# prometheus address
                        +# By default, Scylla binds all interfaces to the prometheus API
                        +# It is possible to restrict the listening address to a specific one
                        +prometheus_address: 0.0.0.0
                        +
                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/robots.txt b/branch-4.2/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.2/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.2/search.html b/branch-4.2/search.html new file mode 100644 index 000000000..a97962a3d --- /dev/null +++ b/branch-4.2/search.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + + + +
                        + + + + + +
                        + + +
                        + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/searchindex.js b/branch-4.2/searchindex.js new file mode 100644 index 000000000..02cb95866 --- /dev/null +++ b/branch-4.2/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 4, 5, 6, 19, 22, 24, 25, 29, 30, 32, 33, 35, 37, 38], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 26, 27, 28, 29, 32, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 26], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 29, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 27, 28, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 26, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 27, 34, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 33], "user": [1, 2, 6, 7, 9, 26, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9, 32], "refer": [1, 6, 9, 13], "upgrad": [1, 13], "lesson": [1, 9, 28, 29], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 26, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 19, 21, 22, 23, 24, 25, 29, 31, 33, 34, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 29, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 26, 30, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 31, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 27, 30, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 26, 29, 32, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 14, 19, 21, 22, 23, 24, 25], "onc": [2, 12, 21, 25, 31, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 19, 21, 22, 23, 24, 25, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 34, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 32, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 30, 31, 32, 38, 41], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 27, 29, 30, 33, 34, 35, 41], "both": [2, 5, 6, 19, 22, 24, 25, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 26, 39, 41], "updat": [2, 5, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 28, 33, 34, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 34, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 27, 33, 34, 41], "advis": [2, 34], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25], "databas": [2, 5, 7, 21, 29, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 33, 41], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 26, 30, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 32, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 32, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 14, 21, 22, 23, 24, 25, 31, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 12, 14, 16, 19, 21, 22, 24, 25, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 12, 25], "yaml": [2, 5, 6, 12, 17], "To": [2, 4, 5, 6, 14, 17, 21, 22, 23, 24, 25], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 27, 28, 29, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "21": 2, "0": [2, 5, 6, 7, 8, 10, 14, 16, 17, 21, 22, 23, 24, 25], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 14, 16], "3": [2, 4, 5, 6, 14, 16, 20, 35], "5": [2, 5, 6, 14, 16, 19], "3000": [2, 5, 6, 22, 24, 25], "1000": [2, 33], "build": [2, 5], "plugin": 2, "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 14, 28, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25], "dir": [2, 7, 8, 22, 24, 25], "loki": [2, 6, 9], "mnt": 2, "3100": [2, 5], "rule": [2, 5, 7, 10, 25, 31, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 27, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 21, 25], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 29, 34, 35, 37, 39, 41], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 21, 33, 39], "section": [4, 5, 6, 12, 19, 21, 24, 25, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 29, 35, 37, 41], "default": [4, 5, 6, 7, 10, 14, 17, 19, 21, 23, 25, 30, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 19, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25], "scrape": [4, 5, 6], "interv": [4, 5, 6], "20": [4, 5, 6, 38], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 27, 28, 29, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 19, 25, 32, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 27, 29, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 29, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 31, 39, 41], "need": [4, 5, 6, 7, 8, 14, 19, 25, 27, 28, 29, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 27, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 27, 34, 41], "out": [4, 5, 6, 8, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 26, 29, 41], "take": [4, 5, 6, 7, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25], "help": [5, 7, 10, 14, 41], "pleas": [5, 19], "most": [5, 10, 14, 25, 34, 36, 41], "current": [5, 6, 7, 10, 14, 19, 22, 24, 25], "common": [5, 7, 41], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 19], "standalon": 5, "thei": [5, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25], "consolid": 5, "componen": 5, "suggest": [5, 14, 25], "those": [5, 25], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 27, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 27, 28, 35, 41], "support": [5, 6, 14, 15, 26, 32, 41], "want": [5, 6, 10, 22, 24, 25], "latest": [5, 6, 7, 22, 24, 25], "releas": [5, 21, 22, 23, 24, 25], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25], "http": [5, 6, 8, 19, 21, 22, 24, 25, 29, 30, 32, 38], "com": [5, 6, 22, 24, 25, 29, 30, 32, 38], "archiv": [5, 6, 22, 24, 25], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 21, 22, 23, 24], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25], "p": [5, 7, 8, 19, 21, 22, 24, 25], "home": 5, "cd": [5, 6, 22, 24, 25], "verifi": [5, 23], "point": [5, 6, 14, 22, 24, 25], "browser": [5, 6, 8, 14, 19, 22, 24, 25], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 31, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 12, 19, 25, 26, 29, 30, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 27, 30, 31, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 29, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 14, 26, 27, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25], "scrap": 5, "job": [5, 6, 19], "onli": [5, 6, 7, 21, 23, 25, 29, 31, 33, 39, 41], "import": [5, 6, 7, 12, 21, 22, 24, 25, 33], "record": [5, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25], "code": [5, 34], "shell": 5, "prom_rul": [5, 12, 25], "correct": [5, 23], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 32], "host": [5, 6, 7, 9, 19], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23], "127": [5, 7, 19], "right": [5, 6, 14, 34, 41], "typic": [5, 14, 25, 27, 29, 39, 41], "node_export": [5, 6, 7, 9, 16], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 14, 17, 19, 21, 23, 30, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 26, 31], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24], "scylla_reactor_util": 5, "At": [5, 14, 24, 25], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 6, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 27, 28, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 25, 34, 38], "tabl": [5, 6, 10, 16, 26, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 33, 34, 41], "give": [5, 13, 15], "strongli": 5, "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 26, 29, 34, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 31, 33], "mention": [5, 14], "previous": [5, 24, 25], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 30, 33, 41], "privileg": [5, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 25], "laptop": 6, "41": 6, "9": [6, 16, 25], "38": 6, "34": 6, "8": [6, 16, 21, 25], "11": [6, 16], "32": 6, "10": [6, 10, 14, 16], "29": 6, "25": [6, 19], "avoid": [6, 14, 19, 30, 32, 41], "root": [6, 19, 22, 24, 25], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 22, 24, 25], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 29, 41], "higher": [6, 25, 29, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 26, 27, 28], "agent": [6, 7, 8, 9, 16, 19], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25], "within": [6, 10, 14], "protect": 6, "assign": 6, "place": [6, 7, 8, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 27, 29, 30, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25], "2019": [6, 16, 38], "reach": [6, 8, 12, 29, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 29, 30, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 28, 31, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 29, 30, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 26, 27, 28, 29, 30, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 34], "disk": [7, 10, 14, 19, 26, 28, 34], "possibl": [7, 10, 17, 32, 41], "api": [7, 8, 17, 21], "resolv": 7, "explicitli": [7, 14], "request": [7, 17, 34, 40], "how": [7, 8, 10, 14, 22, 24, 25, 27, 28, 29, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 14, 19], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14, 34], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 28], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 27, 28, 29, 34, 35, 41], "abov": [8, 22, 24, 25], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 29, 38, 41], "email": [9, 10], "slack": [9, 10], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11, 34], "wrong": [10, 11, 14, 19, 25, 39, 41], "shown": [10, 19, 22, 24, 25], "overview": [10, 25, 34], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 32, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "sever": [10, 13, 15, 42], "annot": 10, "descript": [10, 34], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 41], "rout": [10, 29, 41], "repres": 10, "tree": 10, "win": [10, 19], "inhibit": 10, "mute": 10, "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 27], "simul": 10, "actual": [10, 37], "low": [10, 41], "space": 10, "lower": [10, 41], "fire": 10, "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 31, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "promemtheu": 12, "non": [12, 19, 21, 28, 29, 34, 38, 41], "json": [12, 14], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "shard": [12, 19, 25, 34], "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "explain": [14, 22, 24, 25, 34], "intern": [14, 29, 41], "potenti": [14, 34, 41], "issu": [14, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": [14, 25, 34, 35, 37], "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 30, 41], "tooltip": 14, "msresolut": 14, "share": [14, 33], "sort": [14, 32, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 32, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 30, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 23, 25], "calcul": [14, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "24": [14, 25], "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": [14, 34], "usual": [14, 19, 34, 41], "easier": 14, "wrapper": 14, "re": [14, 29], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2018": [16, 30], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "56090": 19, "old": [19, 22, 23, 24, 25], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "post": 19, "past": [19, 23], "mai": [19, 33, 34, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": [19, 34], "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 29, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 26, 27, 28, 30, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "while": [19, 21, 22, 24, 25, 33], "increas": [19, 30, 33, 41], "might": [19, 39], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25], "migrat": [21, 22, 24], "lose": 21, "histor": [21, 25], "process": [21, 33, 40], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25], "3001": [21, 22, 24, 25], "9091": [21, 22, 24, 25], "9094": 21, "fail": [21, 27, 29, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25], "back": [21, 27], "recommend": [22, 24, 25], "uninstal": [22, 24, 25], "minor": [22, 24, 25], "9095": [22, 24, 25], "brows": [22, 24, 25], "satisfi": [22, 24, 25], "shut": [22, 24, 25], "caus": [22, 24, 25, 29, 41], "blackout": [22, 24, 25], "normal": [22, 24, 25], "dure": [22, 24, 25], "oper": [22, 24, 25, 34, 41], "complet": [22, 24, 25], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 34, 41], "newer": [24, 25], "ensur": 25, "patch": 25, "skip": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 28], "latenc": [25, 29, 33, 34, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 27], "mechan": [25, 27], "present": 25, "reli": [25, 41], "miss": 25, "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 27, 28, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "primari": [26, 41], "kei": [26, 32, 41], "scan": 26, "These": [26, 41], "kind": [26, 41], "bigger": 26, "care": [26, 27, 28, 41], "replicationfactor": [27, 28], "piec": 27, "determin": [27, 28, 35, 41], "repli": [27, 28, 30, 35, 37, 41], "unavail": [27, 41], "client": [27, 30, 34, 41], "respond": 27, "accompani": 27, "deep": 27, "understand": 27, "acknowledg": 28, "coordin": [28, 29, 35, 37, 41], "hint": 28, "fact": 28, "yet": 28, "ideal": [29, 41], "resourc": [29, 32, 41], "replic": [29, 35, 37, 41], "prepar": [29, 34, 38], "statement": [29, 31, 34, 38], "balanc": [29, 33, 34, 41], "polici": 29, "cours": 29, "intro": 29, "recap": 29, "ring": [29, 41], "architectur": 29, "chunk": [30, 41], "overal": [30, 33, 41], "thu": 30, "www": [30, 38], "07": 30, "13": 30, "effici": [30, 41], "optim": [31, 38, 42], "concret": 31, "thumb": 31, "alwai": 31, "favor": 31, "partit": [32, 34], "BY": [32, 41], "ineffici": [32, 41], "consum": 32, "doc": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "practic": [34, 38], "solv": 34, "left": 34, "categori": [34, 41], "jump": 34, "warn": 34, "cell": 34, "model": [34, 38, 40, 41], "imbal": 34, "imbalanc": 34, "hot": 34, "bottleneck": [34, 38], "cach": 34, "hit": 34, "awar": 34, "order": [34, 41], "due": 34, "unsatisfi": 34, "faulti": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "explan": 38, "08": 38, "best": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "shed": 40, "drop": [40, 41], "repair": 40, "que": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "prevent": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "cost": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 9, 13], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 34, 42], "us": [2, 5, 6, 8, 12, 14, 26, 27, 28, 32, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 30, 38], "node": [6, 36], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 34, 41], "all": [7, 22, 24, 25, 27], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 26, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 27, 28, 35, 41], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 12, 14], "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25], "modifi": 14, "limit": 14, "consist": [14, 27, 28, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "reduc": 19, "total": 19, "number": 19, "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25], "latest": 21, "new": [21, 22, 23, 24, 25], "4": [21, 25], "move": [21, 22, 24, 25], "old": 21, "b": 21, "rollback": [21, 22, 23, 24, 25], "link": [21, 22, 23, 24, 25, 28, 29, 30, 32, 38], "y": [22, 24, 25], "": [22, 24, 25], "i": [22, 24, 25, 36], "run": [22, 24, 25], "correct": [22, 24, 25], "correctli": [22, 24], "kill": [22, 24, 25], "test": [24, 25], "mode": [24, 25], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "some": [26, 27, 28, 29, 30, 31, 32, 35, 37], "allow": [26, 41], "filter": [26, 41], "ani": 28, "univers": [28, 29], "ar": [29, 30, 31, 38], "token": [29, 41], "awar": [29, 41], "select": 30, "non": [30, 31], "page": [30, 41], "blog": [30, 38], "prepar": [31, 39, 41], "revers": [32, 41], "order": 32, "document": 32, "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "Some SELECT queries are non-paged": [[30, "some-select-queries-are-non-paged"]], "Blog-post Links": [[30, "blog-post-links"]], "Some queries use reverse order": [[32, "some-queries-use-reverse-order"]], "Documentation link": [[32, "documentation-link"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some queries are non-prepared": [[31, "some-queries-are-non-prepared"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "Upgrade Procedure": [[23, "upgrade-procedure"], [22, "upgrade-procedure"], [21, "upgrade-procedure"], [25, "upgrade-procedure"], [24, "upgrade-procedure"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[23, "install-the-new-monitoring-stack"], [21, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[23, "validate-the-upgrade"], [21, "validate-the-upgrade"]], "Rollback": [[23, "rollback"], [21, "rollback"]], "Related Links": [[23, "related-links"], [22, "related-links"], [21, "related-links"], [25, "related-links"], [24, "related-links"]], "Some queries use Consistency Level: ANY": [[28, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[28, "link-to-scylla-university"]], "Some queries use ALLOW FILTERING": [[26, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[22, "setting-the-server-s-files"], [25, "setting-the-server-s-files"], [24, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[22, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[22, "validate-the-version-installed-correctly"], [24, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[22, "kill-all-containers"], [25, "kill-all-containers"], [24, "kill-all-containers"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Some queries use Consistency Level: ALL": [[27, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Some queries are not token-aware": [[29, "some-queries-are-not-token-aware"]], "University link": [[29, "university-link"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Rollback to version 3.x": [[25, "rollback-to-version-3-x"], [24, "rollback-to-version-3-x"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "System Overload": [[40, "system-overload"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[17, "prometheus"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "ScyllaDB Monitoring Stack": [[1, "scylladb-monitoring-stack"], [9, "scylladb-monitoring-stack"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[5, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "High Level Architecture": [[9, "high-level-architecture"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.2/sitemap.xml b/branch-4.2/sitemap.xml new file mode 100644 index 000000000..136aaa185 --- /dev/null +++ b/branch-4.2/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.2/troubleshooting/index.html b/branch-4.2/troubleshooting/index.html new file mode 100644 index 000000000..c305bf715 --- /dev/null +++ b/branch-4.2/troubleshooting/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Troubleshooting Guide for Scylla Monitoring Stack

                        +
                        +
                        +

                        Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/troubleshooting/monitor_troubleshoot.html b/branch-4.2/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..f3f310ca9 --- /dev/null +++ b/branch-4.2/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,890 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Troubleshoot Scylla Monitoring Stack

                        +

                        This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                        +
                        +

                        Problem

                        +
                        +

                        Scylla-Manager 2.2 with Duplicate information

                        +

                        Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                        +
                          +
                        • For Manager server: from 56090 to 5090

                        • +
                        • For Manager Agent: from 56090 to 5090

                        • +
                        +

                        For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                        +

                        However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                        +

                        The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                        +

                        Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                        +
                        +
                        +

                        A Container Fails To Start

                        +

                        When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                        +
                        Wait for Prometheus container to start........Error: Prometheus container failed to start
                        +
                        +
                        +

                        Should this happen, check the Docker logs for more information.

                        +
                        docker logs aprom
                        +
                        +
                        +

                        Usually the reason for the failure is described in the logs.

                        +
                        +
                        +

                        Files And Directory Permissions

                        +
                        +

                        Note

                        +

                        Avoid running Docker containers as root.

                        +
                        +

                        The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                        +

                        If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                        +
                        +

                        Note

                        +

                        If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                        +
                        +

                        For example if your Prometheus data directory is /prom-data and you are using centos user

                        +
                        ls -la /|grep prom-data
                        +
                        +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                        +
                        +sudo chown -R centos:centos /prom-data
                        +
                        +ls -la /|grep prom-data
                        +
                        +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                        +
                        +
                        +
                        +
                        +

                        No Data Points

                        +

                        No data points on all data charts.

                        +
                        +

                        Solution

                        +

                        If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                        +
                          +
                        1. Login to the Prometheus console:

                        2. +
                        3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                        4. +
                        5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                        6. +
                        +
                        +
                          +
                        • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                        • +
                        • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                        • +
                        • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                        • +
                        +
                        +

                        For example:

                        +
                        ./start-all.sh -v 3.1
                        +
                        +
                        +

                        More on start-all.sh options.

                        +
                        +
                        +
                        +

                        Grafana Chart Shows Error (!) Sign

                        +

                        Run this procedure on the Scylla Monitoring Stack server.

                        +

                        If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                        +
                        +

                        Solution

                        +

                        On the Scylla Monitoring Stack server:

                        +
                          +
                        1. Check Prometheus is running using docker ps.

                        2. +
                        +
                          +
                        • If it is not running check the prometheus.yml for errors.

                        • +
                        +

                        For example:

                        +
                        CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                        +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                        +
                        +
                        +
                          +
                        • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                        • +
                        +
                        +
                        +
                        +

                        Grafana Shows Server Level Metrics, but not Scylla Metrics

                        +

                        Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                        +
                        +

                        Solution

                        +
                          +
                        • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                        • +
                        +

                        For example

                        +
                        curl 172.17.0.2:9180/metrics
                        +
                        +
                        +
                        +
                        +
                        +

                        Grafana Shows Scylla Metrics, but not Server Level Metrics

                        +

                        Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                        +
                        +

                        Solution

                        +

                        1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                        +
                          +
                        1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                        2. +
                        +
                        +
                        +

                        Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                        +

                        While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                        +

                        If the node_exporter service is not starting it may need to be updated manually.

                        +

                        Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                        +
                        +
                        +
                        +

                        Reducing the total number of metrics

                        +

                        In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                        +
                        +

                        Remove interrupts from node_exporter

                        +

                        By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                        +
                        +
                        +
                        +

                        Working with Wireshark

                        +

                        No metrics shown in the Scylla Monitoring Stack.

                        +
                          +
                        1. Install wireshark

                        2. +
                        +

                        2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                        +

                        For example:

                        +
                        tshark -i eth0 -f "dst port 9180"
                        +
                        +
                        +

                        Capture from Scylla node towards Scylla Monitoring Stack server.

                        +

                        In this example, Scylla is running.

                        +
                        Monitor ip        Scylla node ip
                        +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                        +
                        +
                        +

                        In this example, Scylla is not running

                        +
                        Monitor ip        Scylla node ip
                        +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                        +
                        +
                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/index.html b/branch-4.2/upgrade/index.html new file mode 100644 index 000000000..18db4ab6b --- /dev/null +++ b/branch-4.2/upgrade/index.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Scylla Monitoring Stack

                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.2/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..522de54c1 --- /dev/null +++ b/branch-4.2/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,809 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                        +

                        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

                        +

                        Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                        +
                        +

                        Upgrade Procedure

                        +
                        +

                        1. Upgrade to the latest 1.x version

                        +

                        Before starting the upgrade procedure, make sure you are running the latest 1.x version

                        +
                        +
                        +

                        2. Install the new monitoring stack

                        +
                          +
                        1. Download the 2.x version from the release page.

                        2. +
                        3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                        4. +
                        5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                          +
                            +
                          • scylla_servers.yml

                          • +
                          • scylla_manager_servers.yml

                          • +
                          • node_exporter_servers.yml

                          • +
                          +
                        6. +
                        7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                        8. +
                        +
                        ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                        +
                        +
                        +
                        +

                        Note

                        +

                        Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                        +
                        +

                        While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                        +
                        ./kill-all.sh -g 3001 -p 9091 -m 9094
                        +
                        +
                        +
                        +

                        Validation

                        +

                        Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                        +
                        +
                        +
                        +

                        3. Alerting Rules

                        +

                        Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                        +
                        +
                        +

                        4. Moving to Prometheus 2.x

                        +

                        Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                        +

                        Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                        +
                        +

                        a. Set the old system

                        +

                        The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                        +
                          +
                        • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                        • +
                        • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                        • +
                        +
                        +

                        Note

                        +

                        After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                        +
                        +
                        +
                        +

                        b. Set the new system

                        +

                        The following step will allow the new monitoring system to read historical metrics from the old system.

                        +
                          +
                        • In the Prometheus prometheus.yml.template file add the following at the end:

                        • +
                        +
                        remote_read:
                        +  - url: "http://{ip}:9111/api/v1/read"
                        +
                        +
                        +

                        Where {ip} is the ip of the old system.

                        +
                          +
                        • restart the new stack

                        • +
                        +
                        +
                        +
                        +

                        Validate the upgrade

                        +

                        You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                        +
                        +
                        +
                        +

                        Rollback

                        +

                        In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                        +
                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..0210b7550 --- /dev/null +++ b/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,803 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                        +

                        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                        +
                        +

                        Upgrade Procedure

                        +

                        We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                        +

                        Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                        +
                        +

                        Install 2.y (The new version)

                        +
                        wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                        +unzip scylla-monitoring-2.y.zip
                        +cd scylla-monitoring-scylla-monitoring-2.y/
                        +
                        +
                        +

                        Replace “y” with the new minor release number, for example, 2.1.zip

                        +
                        +
                        +

                        Setting the server’s files

                        +

                        Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                        +
                        cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                        +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                        +
                        +
                        +
                        +
                        +

                        Validate the new version is running the correct version

                        +

                        Starting from Scylla-Monitoring version 2.2, you can run:

                        +
                        ./start-all.sh --version
                        +
                        +
                        +

                        To validate the Scylla-Monitoring version.

                        +
                        +
                        +

                        Validate the version installed correctly

                        +

                        To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                        +
                        ./start-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        Browse to http://{ip}:9091 +And check the Grafana dashboard

                        +

                        Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                        +
                        +

                        Caution

                        +

                        Important: do not use the local dir flag when testing!

                        +
                        +

                        When you are satisfied with the data in the dashboard, you can shut down the containers.

                        +
                        +

                        Caution

                        +

                        Important: Do not kill the 2.x version that is currently running.

                        +
                        +

                        Use the following command to kill the containers:

                        +
                        ./kill-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        You can start and stop the new 2.y version while testing.

                        +
                        +
                        +

                        Move to version 2.y (the new version)

                        +

                        Note: migrating will cause a few seconds of blackout in the system.

                        +

                        We assume that you are using external volume to store the metrics data.

                        +
                        +

                        Kill all containers

                        +

                        Follow the instruction on how to kill the 2.y version when in testing mode.

                        +

                        To kill the 2.x version containers, run:

                        +
                        ./kill-all.sh
                        +
                        +
                        +

                        Start version 2.y in normal mode

                        +

                        From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                        +
                        ./start-all.sh -d /path/to/data/dir
                        +
                        +
                        +

                        Point your browser to http://{ip}:3000 and see that the data is there.

                        +
                        +
                        +
                        +

                        Rollback to version 2.x

                        +

                        To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                        +

                        To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                        +
                        ./kill-all.sh
                        +cd /path/to/scylla-grafana-2.x/
                        +./start-all.sh -d /path/to/data/dir
                        +
                        +
                        +
                        +
                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..5cca3d931 --- /dev/null +++ b/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,767 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                        +

                        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

                        +

                        Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                        +
                        +

                        Upgrade Procedure

                        +
                        +

                        1. Validate node_exporter version

                        +

                        Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                        +

                        If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                        +
                        +
                        +

                        2. Install the new monitoring stack

                        +
                          +
                        1. Download the 3.x version from the release page.

                        2. +
                        3. Unzip it into a different directory.

                        4. +
                        5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                          +
                            +
                          • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                          • +
                          • scylla_manager_servers.yml

                          • +
                          +
                          +
                          +

                          Note

                          +

                          The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                          +
                          +
                          +
                        6. +
                        7. Stop the old monitoring stack

                          +
                          +
                          ./kill-all.sh
                          +
                          +
                          +
                          +
                        8. +
                        9. Start the new monitoring stack

                          +
                          +
                          ./start-all.sh -d /prometheus-data-path
                          +
                          +
                          +
                          +
                        10. +
                        +
                        +
                        +

                        Validate the upgrade

                        +

                        You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                        +

                        Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                        +
                        +
                        +
                        +

                        Rollback

                        +

                        To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                        +
                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..785235a3f --- /dev/null +++ b/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                        +

                        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                        +
                        +

                        Upgrade Procedure

                        +

                        We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                        +

                        Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                        +
                        +

                        Install 3.y (The new version)

                        +
                        wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                        +unzip scylla-monitoring-3.y.zip
                        +cd scylla-monitoring-scylla-monitoring-3.y/
                        +
                        +
                        +

                        Replace “y” with the new minor release number, for example, 3.0.1.zip

                        +
                        +
                        +

                        Setting the server’s files

                        +

                        Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                        +
                        cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                        +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                        +
                        +
                        +
                        +
                        +

                        Validate the new version is running the correct version

                        +

                        Starting from Scylla-Monitoring version 2.2, you can run:

                        +
                        ./start-all.sh --version
                        +
                        +
                        +

                        To validate the Scylla-Monitoring version.

                        +
                        +
                        +

                        Validate the version installed correctly

                        +

                        To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                        +
                        ./start-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        Browse to http://{ip}:9091 +And check the Grafana dashboard

                        +

                        Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                        +
                        +

                        Caution

                        +

                        Important: do not use the local dir flag when testing!

                        +
                        +

                        When you are satisfied with the data in the dashboard, you can shut down the containers.

                        +
                        +

                        Caution

                        +

                        Important: Do not kill the 3.x version that is currently running.

                        +
                        +
                        +
                        +

                        Killing the new 3.y Monitoring stack in testing mode

                        +

                        Use the following command to kill the containers:

                        +
                        ./kill-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        You can start and stop the new 3.y version while testing.

                        +
                        +
                        +

                        Move to version 3.y (the new version)

                        +

                        Note: migrating will cause a few seconds of blackout in the system.

                        +

                        We assume that you are using external volume to store the metrics data.

                        +
                        +

                        Kill all containers

                        +

                        At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                        +

                        Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                        +

                        kill the older 3.x version containers by running:

                        +
                        ./kill-all.sh
                        +
                        +
                        +

                        Start version 3.y in normal mode

                        +

                        From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                        +
                        ./start-all.sh -d /path/to/data/dir
                        +
                        +
                        +

                        Point your browser to http://{ip}:3000 and see that the data is there.

                        +
                        +
                        +
                        +

                        Rollback to version 3.x

                        +

                        To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                        +

                        To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                        +
                        ./kill-all.sh
                        +cd /path/to/scylla-grafana-3.x/
                        +./start-all.sh -d /path/to/data/dir
                        +
                        +
                        +
                        +
                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..cb033e594 --- /dev/null +++ b/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,954 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                        +

                        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                        +
                        +

                        Upgrade Procedure

                        +

                        We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                        +

                        Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                        +
                        +

                        Install 4.y (The new version)

                        +
                        wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                        +unzip scylla-monitoring-4.y.zip
                        +cd scylla-monitoring-scylla-monitoring-4.y/
                        +
                        +
                        +

                        Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                        +
                        +
                        +

                        Setting the server’s files

                        +

                        Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                        +
                        cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                        +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                        +
                        +
                        +
                        +
                        +

                        Validate the new version is running the correct version

                        +

                        run:

                        +
                        ./start-all.sh --version
                        +
                        +
                        +

                        To validate the Scylla-Monitoring version.

                        +
                        +
                        +
                        +

                        Running in test mode

                        +

                        This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                        +
                        +

                        Running second monitoring stack

                        +

                        We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                        +
                        ./start-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        Browse to http://{ip}:9091 and check the Grafana dashboard.

                        +

                        Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                        +
                        +

                        Caution

                        +

                        Important: do not use the local dir flag when testing!

                        +
                        +

                        When you are satisfied with the data in the dashboard, you can shut down the containers.

                        +
                        +

                        Caution

                        +

                        Important: Do not kill the 3.x version that is currently running!

                        +
                        +
                        +
                        +

                        Killing the new 4.y Monitoring stack in testing mode

                        +

                        Use the following command to kill the containers:

                        +
                        ./kill-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        You can start and stop the new 4.y version while testing.

                        +
                        +
                        +
                        +

                        Migrating

                        +
                        +

                        Move to version 4.y (the new version)

                        +

                        Note: migrating will cause a few seconds of blackout in the system.

                        +

                        We assume that you are using external volume to store the metrics data.

                        +
                        +

                        Backup

                        +

                        We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                        +
                        +
                        +

                        Kill all containers

                        +

                        At this point you have two monitoring stacks installed with the older version running.

                        +

                        If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                        +

                        kill the older 3.x version containers by running:

                        +
                        ./kill-all.sh
                        +
                        +
                        +

                        Start version 4.y in normal mode

                        +

                        From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                        +
                        ./start-all.sh -d /path/to/copy/data/dir
                        +
                        +
                        +

                        Point your browser to http://{ip}:3000 and see that the data is there.

                        +
                        +
                        +
                        +

                        Rollback to version 3.x

                        +

                        To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                        +

                        To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                        +
                        ./kill-all.sh
                        +cd /path/to/scylla-grafana-3.x/
                        +./start-all.sh -d /path/to/original/data/dir
                        +
                        +
                        +
                        +
                        +
                        +

                        Post-installation: Metrics back-filling

                        +

                        Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                        +

                        For example, this is a recording rule that calculates the p99 write latency:

                        +
                        - record: wlatencyp99
                        +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                        +  labels:
                        +    by: "instance,shard"
                        +
                        +
                        +

                        For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                        +

                        Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                        +
                        +
                        +

                        Note

                        +

                        If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                        +
                        +
                        +
                        +../_images/before-backfilling.png +
                        +

                        This is an example of missing latency graph

                        +
                        +
                        +

                        The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                        +

                        For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                        +

                        In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                        +

                        The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                        +
                        +

                        Determine the backfilling period

                        +

                        When you run the backfilling process you need to determine the start time and end time.

                        +
                        +

                        Determine the start time

                        +

                        The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                        +

                        If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                        +

                        For the rest of this example, we will assume that your retention time is 360 days.

                        +
                        +
                        +

                        Determine the end time

                        +

                        Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                        +

                        If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                        +

                        That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                        +

                        The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                        +
                        +
                        +
                        +

                        Backfilling Process

                        +
                        +

                        backup

                        +

                        If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                        +

                        To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                        +
                        +
                        +

                        Restart the monitoring stack

                        +

                        You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                        +

                        -b "--storage.tsdb.allow-overlapping-blocks"

                        +
                        +
                        +

                        Create the data files

                        +

                        We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                        +

                        The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                        +

                        Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                        +
                        docker exec -it aprom sh
                        +cd /prometheus/data/
                        +promtool tsdb create-blocks-from rules \
                        +--start $start \
                        +--end $end \
                        +--url http://localhost:9090 \
                        +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                        +
                        +
                        +

                        It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                        +
                        +
                        +

                        Note

                        +

                        Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                        +
                        +
                        +
                        +
                        +

                        Copy the data files

                        +

                        Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                        +

                        Copy the data files to the Prometheus directory:

                        +
                        cp data/* .
                        +
                        +
                        +

                        The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                        +

                        Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                        +
                        +../_images/after-backfilling.jpg +
                        +

                        Un example: after loading half of the data

                        +
                        +
                        +
                        +
                        +
                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.2/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..bdd2f3736 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries use ALLOW FILTERING

                        +

                        Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                        +

                        These kinds of queries can create a bigger load on Scylla, and should be used with care.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlCLAll.html b/branch-4.2/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..4be764786 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries use Consistency Level: ALL

                        +

                        Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                        +

                        Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                        +

                        Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlCLAny.html b/branch-4.2/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..de66f92b6 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries use Consistency Level: ANY

                        +

                        Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                        +

                        Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.2/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..8f527ecfd --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries are not token-aware

                        +

                        Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                        +

                        Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlNonPaged.html b/branch-4.2/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..83b88e8e5 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some SELECT queries are non-paged

                        +

                        By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                        +
                        +

                        Blog-post Links

                        +

                        https://www.scylladb.com/2018/07/13/efficient-query-paging/

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.2/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..70ec3019c --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries are non-prepared

                        +

                        Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlReverseOrder.html b/branch-4.2/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..a1defc5b8 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries use reverse order

                        +

                        Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                        +

                        Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/heavyCompaction.html b/branch-4.2/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..c1279c9d2 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Compaction takes lots of memory and CPU

                        +

                        ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                        +

                        If this is the case, you can do one of the following:

                        +
                          +
                        • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                          +
                          +
                            +
                          • In the scylla.yml configuration file: compaction_static_shares: 100

                          • +
                          • In the command line when starting ScyllaDB: --compaction-static-shares 100

                          • +
                          +
                          +

                          You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                          +
                        • +
                        • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                        • +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/index.html b/branch-4.2/use-monitoring/advisor/index.html new file mode 100644 index 000000000..8d09943bf --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/index.html @@ -0,0 +1,722 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Stack Advisor

                        +
                        +
                        +

                        The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                        +
                        +

                        The Advisor section

                        +
                        +../../_images/advisor_panel.png +
                        +

                        The Advisor section

                        +
                        +
                        +

                        The Advisor section is located on the Overview dashboard and consists of two parts:

                        +

                        On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                        +

                        For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                        +

                        On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                        +

                        For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                        +

                        Each Advisor issue is explained in detail:

                        + +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/nodeCLErrors.html b/branch-4.2/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..dcaa5dc02 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Some operation failed due to unsatisfied consistency level

                        +

                        ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                        +

                        For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                        +

                        When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/nodeIOErrors.html b/branch-4.2/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..dfe109154 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        I/O Errors can indicate a node with a faulty disk

                        +

                        I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.2/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..b758a65c1 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Some operations failed on the replica side

                        +

                        ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                        +

                        An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.2/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..ba5e37c99 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        CQL queries are not balanced among shards

                        +

                        For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                        +

                        There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                        +
                        +

                        Blog post link

                        +

                        https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.2/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..c9f8d524a --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,693 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Prepared statements cache eviction

                        +

                        Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                        +
                          +
                        • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                        • +
                        • The prepared statements cache might be too small for the number of prepared statements.

                        • +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/systemOverload.html b/branch-4.2/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..5793308f2 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        System Overload

                        +

                        There could be multiple indications that a system is overloaded:

                        +
                          +
                        • Timeouts

                        • +
                        • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                        • +
                        • CPU at 100% when no background process (like compaction or repair) runs.

                        • +
                        • Ques are getting filled.

                        • +
                        +

                        If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/cql_optimization.html b/branch-4.2/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..e96df1911 --- /dev/null +++ b/branch-4.2/use-monitoring/cql_optimization.html @@ -0,0 +1,809 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        The CQL Optimization

                        +

                        The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                        +
                        +../_images/cql_optimization_master.png +
                        +

                        The CQL Dashboard

                        +
                        +
                        +

                        The upper part of the dashboard holds CQL related metrics.

                        +

                        The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                        +
                        +

                        Note

                        +

                        Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                        +
                        +

                        The following sections describe each of the dashboard’s panel

                        +
                        +

                        Prepared Statements

                        +

                        Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                        +

                        Using prepared statements has the following benefits:

                        +
                          +
                        • The database only needs to parse the query once

                        • +
                        • The driver can route the query to the right node

                        • +
                        • Using place-holders and values is safer and prevents CQL-Injection

                        • +
                        +

                        The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                        +

                        The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                        +
                        +
                        +

                        Token Aware

                        +

                        Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                        +

                        Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                        +

                        The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                        +

                        The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                        +
                        +
                        +

                        Paged Queries

                        +

                        By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                        +

                        The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                        +

                        The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                        +
                        +
                        +

                        Reversed CQL Reads

                        +

                        Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                        +

                        Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                        +

                        For example, look at the following table:

                        +
                        CREATE TABLE ks1.table_demo (
                        +   category text,
                        +   type int,
                        +   PRIMARY KEY (category, type))
                        +WITH CLUSTERING ORDER BY (type DESC);
                        +
                        +
                        +

                        The following query uses reverse order:

                        +
                        select * from ks1.table_demo where category='cat1' order by type ASC;
                        +
                        +
                        +

                        The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                        +

                        The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                        +
                        +
                        +

                        ALLOW FILTERING

                        +

                        Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                        +

                        These kinds of queries can create a big load on the system, and should be used with care.

                        +

                        The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                        +

                        The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                        +

                        The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                        +

                        The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                        +

                        The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                        +
                        +
                        +

                        Consistency Level

                        +

                        Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                        +

                        The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                        +

                        Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                        +

                        The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                        +

                        The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                        +

                        The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                        +

                        The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                        +
                        +
                        +

                        Cross DC

                        +

                        Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                        +
                        +
                        +

                        Cross DC Consistency Level

                        +

                        Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                        +
                        +
                        +

                        Cross DC read requests

                        +
                        +

                        Note

                        +

                        The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                        +
                        +

                        In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                        +

                        The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/index.html b/branch-4.2/use-monitoring/index.html new file mode 100644 index 000000000..35b27c965 --- /dev/null +++ b/branch-4.2/use-monitoring/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Using Scylla Monitoring Stack

                        +
                        +
                        +

                        There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.3/.buildinfo b/branch-4.3/.buildinfo new file mode 100644 index 000000000..c23efc277 --- /dev/null +++ b/branch-4.3/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: fa0399a9f32eb1afc60c86c623f83ab8 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.3/.doctrees/_common/monitor-description.doctree b/branch-4.3/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..8735f0a00 Binary files /dev/null and b/branch-4.3/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-4.3/.doctrees/environment.pickle b/branch-4.3/.doctrees/environment.pickle new file mode 100644 index 000000000..6091364ec Binary files /dev/null and b/branch-4.3/.doctrees/environment.pickle differ diff --git a/branch-4.3/.doctrees/index.doctree b/branch-4.3/.doctrees/index.doctree new file mode 100644 index 000000000..7e1cb4802 Binary files /dev/null and b/branch-4.3/.doctrees/index.doctree differ diff --git a/branch-4.3/.doctrees/install/docker_compose.doctree b/branch-4.3/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..6f060dd0a Binary files /dev/null and b/branch-4.3/.doctrees/install/docker_compose.doctree differ diff --git a/branch-4.3/.doctrees/install/index.doctree b/branch-4.3/.doctrees/install/index.doctree new file mode 100644 index 000000000..361127eee Binary files /dev/null and b/branch-4.3/.doctrees/install/index.doctree differ diff --git a/branch-4.3/.doctrees/install/min-prod-hw.doctree b/branch-4.3/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..d1913f5a2 Binary files /dev/null and b/branch-4.3/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.3/.doctrees/install/monitor_without_docker.doctree b/branch-4.3/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..2e7e250d8 Binary files /dev/null and b/branch-4.3/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-4.3/.doctrees/install/monitoring_stack.doctree b/branch-4.3/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..5abe7b718 Binary files /dev/null and b/branch-4.3/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-4.3/.doctrees/install/start_all.doctree b/branch-4.3/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..5ba4e3c0a Binary files /dev/null and b/branch-4.3/.doctrees/install/start_all.doctree differ diff --git a/branch-4.3/.doctrees/install/thanos.doctree b/branch-4.3/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..156671666 Binary files /dev/null and b/branch-4.3/.doctrees/install/thanos.doctree differ diff --git a/branch-4.3/.doctrees/intro.doctree b/branch-4.3/.doctrees/intro.doctree new file mode 100644 index 000000000..5fa11ed79 Binary files /dev/null and b/branch-4.3/.doctrees/intro.doctree differ diff --git a/branch-4.3/.doctrees/procedures/alerts/alerting.doctree b/branch-4.3/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..fe65f5a0e Binary files /dev/null and b/branch-4.3/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.3/.doctrees/procedures/alerts/index.doctree b/branch-4.3/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..8096c02d1 Binary files /dev/null and b/branch-4.3/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.3/.doctrees/procedures/datadog/index.doctree b/branch-4.3/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..475531e73 Binary files /dev/null and b/branch-4.3/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.3/.doctrees/procedures/index.doctree b/branch-4.3/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..867154740 Binary files /dev/null and b/branch-4.3/.doctrees/procedures/index.doctree differ diff --git a/branch-4.3/.doctrees/procedures/updating_dashboard.doctree b/branch-4.3/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..216ee8461 Binary files /dev/null and b/branch-4.3/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-4.3/.doctrees/reference/index.doctree b/branch-4.3/.doctrees/reference/index.doctree new file mode 100644 index 000000000..de8afceed Binary files /dev/null and b/branch-4.3/.doctrees/reference/index.doctree differ diff --git a/branch-4.3/.doctrees/reference/matrix.doctree b/branch-4.3/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..830e9055b Binary files /dev/null and b/branch-4.3/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.3/.doctrees/reference/monitoring_apis.doctree b/branch-4.3/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..c96863896 Binary files /dev/null and b/branch-4.3/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-4.3/.doctrees/troubleshooting/index.doctree b/branch-4.3/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..972a438db Binary files /dev/null and b/branch-4.3/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.3/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-4.3/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..4422d4fda Binary files /dev/null and b/branch-4.3/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/index.doctree b/branch-4.3/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..53bf4fd58 Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..4450afcf2 Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..f79380987 Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..fda0dd8e0 Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..fa38b2d08 Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..e9857510d Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..7befcd7b2 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..1575d6949 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..67ba8dc1d Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..2b67c79b8 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..ad2f1dcf0 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..383d4bfe7 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..90616fcbe Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..115973ab9 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..edd13ed9a Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..c18b0f399 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..266d4cd41 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..cc42f45ea Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..bff1325e8 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..f5a865909 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..8887c2f80 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/cql_optimization.doctree b/branch-4.3/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..954bdc7f2 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/index.doctree b/branch-4.3/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..ed0bb035c Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.3/.nojekyll b/branch-4.3/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.3/404.html b/branch-4.3/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.3/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                        +

                        404

                        +

                        The ScyllaDB monster ate your page!

                        +

                        + Home +

                        +
                        + + + \ No newline at end of file diff --git a/branch-4.3/CNAME b/branch-4.3/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.3/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.3/_common/monitor-description.html b/branch-4.3/_common/monitor-description.html new file mode 100644 index 000000000..9c4865f4b --- /dev/null +++ b/branch-4.3/_common/monitor-description.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +

                        ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                        + + +
                        + + + + + +
                        + + +
                        + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.3/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.3/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/branch-4.3/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/branch-4.3/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.3/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.3/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.3/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.3/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/branch-4.3/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.3/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.3/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/branch-4.3/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.3/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.3/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/branch-4.3/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.3/_images/1.png b/branch-4.3/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.3/_images/1.png differ diff --git a/branch-4.3/_images/2.png b/branch-4.3/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.3/_images/2.png differ diff --git a/branch-4.3/_images/3.png b/branch-4.3/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.3/_images/3.png differ diff --git a/branch-4.3/_images/advisor_panel.png b/branch-4.3/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-4.3/_images/advisor_panel.png differ diff --git a/branch-4.3/_images/after-backfilling.jpg b/branch-4.3/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.3/_images/after-backfilling.jpg differ diff --git a/branch-4.3/_images/alertmanager.png b/branch-4.3/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.3/_images/alertmanager.png differ diff --git a/branch-4.3/_images/before-backfilling.png b/branch-4.3/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.3/_images/before-backfilling.png differ diff --git a/branch-4.3/_images/cql_optimization_master.png b/branch-4.3/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.3/_images/cql_optimization_master.png differ diff --git a/branch-4.3/_images/datadog.png b/branch-4.3/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.3/_images/datadog.png differ diff --git a/branch-4.3/_images/grafana.png b/branch-4.3/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.3/_images/grafana.png differ diff --git a/branch-4.3/_images/monitor.png b/branch-4.3/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-4.3/_images/monitor.png differ diff --git a/branch-4.3/_images/monitoring_stack.png b/branch-4.3/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.3/_images/monitoring_stack.png differ diff --git a/branch-4.3/_images/monitoring_stack1.png b/branch-4.3/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.3/_images/monitoring_stack1.png differ diff --git a/branch-4.3/_sources/_common/monitor-description.rst.txt b/branch-4.3/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.3/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.3/_sources/index.rst.txt b/branch-4.3/_sources/index.rst.txt new file mode 100644 index 000000000..97ea5ff5a --- /dev/null +++ b/branch-4.3/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on Scylla University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.3/_sources/install/docker_compose.rst.txt b/branch-4.3/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.3/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.3/_sources/install/index.rst.txt b/branch-4.3/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-4.3/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.3/_sources/install/min-prod-hw.rst.txt b/branch-4.3/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/branch-4.3/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                        + + + + + + + + + + + +
                        # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                        00
                        + +
                        + \ No newline at end of file diff --git a/branch-4.3/_sources/install/monitor_without_docker.rst.txt b/branch-4.3/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..d0be59164 --- /dev/null +++ b/branch-4.3/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                        `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.3/_sources/install/monitoring_stack.rst.txt b/branch-4.3/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..b43ff5b1f --- /dev/null +++ b/branch-4.3/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,403 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API <../../reference/monitoring_apis/#prometheus>`_ + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                        `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.3/_sources/install/start_all.rst.txt b/branch-4.3/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..3d5aadc8b --- /dev/null +++ b/branch-4.3/_sources/install/start_all.rst.txt @@ -0,0 +1,102 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.3/_sources/install/thanos.rst.txt b/branch-4.3/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.3/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.3/_sources/intro.rst.txt b/branch-4.3/_sources/intro.rst.txt new file mode 100644 index 000000000..67e73435b --- /dev/null +++ b/branch-4.3/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.3/_sources/procedures/alerts/alerting.rst.txt b/branch-4.3/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.3/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.3/_sources/procedures/alerts/index.rst.txt b/branch-4.3/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.3/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.3/_sources/procedures/datadog/index.rst.txt b/branch-4.3/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..c36878a27 --- /dev/null +++ b/branch-4.3/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,65 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the promemtheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Non cloud users, download the rules configuration file :download:`datadog.rules.yml ` and place it under prometheus/prom_rules/. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.3/_sources/procedures/index.rst.txt b/branch-4.3/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..9e17f2aa1 --- /dev/null +++ b/branch-4.3/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.3/_sources/procedures/updating_dashboard.rst.txt b/branch-4.3/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.3/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.3/_sources/reference/index.rst.txt b/branch-4.3/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-4.3/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.3/_sources/reference/matrix.rst.txt b/branch-4.3/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..5e3a70d72 --- /dev/null +++ b/branch-4.3/_sources/reference/matrix.rst.txt @@ -0,0 +1,140 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.3/_sources/reference/monitoring_apis.rst.txt b/branch-4.3/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..ce53e9d8f --- /dev/null +++ b/branch-4.3/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring_stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.3/_sources/troubleshooting/index.rst.txt b/branch-4.3/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-4.3/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-4.3/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-4.3/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..3026df586 --- /dev/null +++ b/branch-4.3/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor_without_docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.3/_sources/upgrade/index.rst.txt b/branch-4.3/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..817f65247 --- /dev/null +++ b/branch-4.3/_sources/upgrade/index.rst.txt @@ -0,0 +1,42 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                        +
                        +
                        +
                        Upgrade Scylla Open Source
                        +
                        +
                        + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                        +
                        +
                        diff --git a/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..0e4fd3baa --- /dev/null +++ b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,103 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + + + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..3bb8af42b --- /dev/null +++ b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,132 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..d1974adfc --- /dev/null +++ b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,63 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..a356f5c21 --- /dev/null +++ b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,138 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..b64fd5d7e --- /dev/null +++ b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,281 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-4.3/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.3/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.3/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.3/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.3/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.3/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.3/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.3/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.3/_sources/use-monitoring/cql_optimization.rst.txt b/branch-4.3/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.3/_sources/use-monitoring/index.rst.txt b/branch-4.3/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.3/_static/basic.css b/branch-4.3/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.3/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.3/_static/check-solid.svg b/branch-4.3/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.3/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.3/_static/clipboard.min.js b/branch-4.3/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.3/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.3/_static/copybutton.css b/branch-4.3/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.3/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                        Short

                        + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.3/_static/copybutton.js b/branch-4.3/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.3/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.3/_static/copybutton_funcs.js b/branch-4.3/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.3/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.3/_static/css/main.css b/branch-4.3/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-4.3/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.3/_static/doctools.js b/branch-4.3/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.3/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.3/_static/documentation_options.js b/branch-4.3/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.3/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.3/_static/file.png b/branch-4.3/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.3/_static/file.png differ diff --git a/branch-4.3/_static/img/banner-background.svg b/branch-4.3/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.3/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.3/_static/img/favicon-228x228.png b/branch-4.3/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.3/_static/img/favicon-228x228.png differ diff --git a/branch-4.3/_static/img/favicon-32x32.png b/branch-4.3/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.3/_static/img/favicon-32x32.png differ diff --git a/branch-4.3/_static/img/favicon.ico b/branch-4.3/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.3/_static/img/favicon.ico differ diff --git a/branch-4.3/_static/img/icons/icon-about-team.svg b/branch-4.3/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.3/_static/img/icons/icon-about-us-m.svg b/branch-4.3/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-about-us.svg b/branch-4.3/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-alternator.svg b/branch-4.3/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-apps.svg b/branch-4.3/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-architecture.svg b/branch-4.3/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.3/_static/img/icons/icon-benchmarks.svg b/branch-4.3/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.3/_static/img/icons/icon-blog.svg b/branch-4.3/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.3/_static/img/icons/icon-careers.svg b/branch-4.3/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.3/_static/img/icons/icon-chevron-left.svg b/branch-4.3/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.3/_static/img/icons/icon-chevron-right.svg b/branch-4.3/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.3/_static/img/icons/icon-circe.svg b/branch-4.3/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-clock.svg b/branch-4.3/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-close.svg b/branch-4.3/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-cloud-docs.svg b/branch-4.3/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-cloud.svg b/branch-4.3/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-comparison.svg b/branch-4.3/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.3/_static/img/icons/icon-contact-us.svg b/branch-4.3/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.3/_static/img/icons/icon-developers-blog.svg b/branch-4.3/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.3/_static/img/icons/icon-docs.svg b/branch-4.3/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.3/_static/img/icons/icon-enterprise-m.svg b/branch-4.3/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-enterprise.svg b/branch-4.3/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-events.svg b/branch-4.3/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.3/_static/img/icons/icon-exclamation.svg b/branch-4.3/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-expand.svg b/branch-4.3/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-forum.svg b/branch-4.3/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-getting-started.svg b/branch-4.3/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-glossary.svg b/branch-4.3/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-home.svg b/branch-4.3/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-infoworld.svg b/branch-4.3/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.3/_static/img/icons/icon-integrations.svg b/branch-4.3/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-knowledge-base.svg b/branch-4.3/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-less.svg b/branch-4.3/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-live-test.svg b/branch-4.3/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.3/_static/img/icons/icon-mail-list.svg b/branch-4.3/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-manager.svg b/branch-4.3/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.3/_static/img/icons/icon-memory-management.svg b/branch-4.3/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.3/_static/img/icons/icon-modeling.svg b/branch-4.3/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-monitoring.svg b/branch-4.3/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.3/_static/img/icons/icon-networking.svg b/branch-4.3/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.3/_static/img/icons/icon-news.svg b/branch-4.3/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.3/_static/img/icons/icon-newsletter.svg b/branch-4.3/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.3/_static/img/icons/icon-nsql-guides.svg b/branch-4.3/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.3/_static/img/icons/icon-open-source.svg b/branch-4.3/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.3/_static/img/icons/icon-operator.svg b/branch-4.3/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-overview.svg b/branch-4.3/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.3/_static/img/icons/icon-partners.svg b/branch-4.3/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.3/_static/img/icons/icon-plus.svg b/branch-4.3/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-pricing.svg b/branch-4.3/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.3/_static/img/icons/icon-release-notes.svg b/branch-4.3/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.3/_static/img/icons/icon-resource-center.svg b/branch-4.3/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.3/_static/img/icons/icon-roadmap.svg b/branch-4.3/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.3/_static/img/icons/icon-search.svg b/branch-4.3/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.3/_static/img/icons/icon-slack.svg b/branch-4.3/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-stack-overflow.svg b/branch-4.3/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.3/_static/img/icons/icon-summit.svg b/branch-4.3/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-support.svg b/branch-4.3/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.3/_static/img/icons/icon-tech-talks.svg b/branch-4.3/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.3/_static/img/icons/icon-testing.svg b/branch-4.3/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.3/_static/img/icons/icon-thumbs-down.svg b/branch-4.3/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-thumbs-up.svg b/branch-4.3/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-tip.svg b/branch-4.3/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.3/_static/img/icons/icon-training.svg b/branch-4.3/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.3/_static/img/icons/icon-triangle-down.svg b/branch-4.3/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.3/_static/img/icons/icon-university.svg b/branch-4.3/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.3/_static/img/icons/icon-users-blog.svg b/branch-4.3/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.3/_static/img/icons/icon-warning.svg b/branch-4.3/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-webinars.svg b/branch-4.3/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.3/_static/img/icons/icon-whitepapers.svg b/branch-4.3/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.3/_static/img/icons/icon-workshop.svg b/branch-4.3/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/logo-docs.svg b/branch-4.3/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.3/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.3/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.3/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.3/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.3/_static/img/mascots/404.jpg b/branch-4.3/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.3/_static/img/mascots/404.jpg differ diff --git a/branch-4.3/_static/img/mascots/scylla-3monsters.png b/branch-4.3/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.3/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-alternator.svg b/branch-4.3/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.3/_static/img/mascots/scylla-cloud.svg b/branch-4.3/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.3/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.3/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-computer-headset.png b/branch-4.3/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-cup-number-one.png b/branch-4.3/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-docs.svg b/branch-4.3/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.3/_static/img/mascots/scylla-drivers.svg b/branch-4.3/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.3/_static/img/mascots/scylla-enterprise.svg b/branch-4.3/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.3/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.3/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-forklift-migration.png b/branch-4.3/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-gear.png b/branch-4.3/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-hardhat.png b/branch-4.3/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-headband.png b/branch-4.3/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-headset.png b/branch-4.3/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-hearts.png b/branch-4.3/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-looking-down.png b/branch-4.3/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-looking-up.png b/branch-4.3/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.3/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.3/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-manager.svg b/branch-4.3/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.3/_static/img/mascots/scylla-monitor.svg b/branch-4.3/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.3/_static/img/mascots/scylla-movement-fast.png b/branch-4.3/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-movement.png b/branch-4.3/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-onpremise.png b/branch-4.3/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-opensource.svg b/branch-4.3/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.3/_static/img/mascots/scylla-operator.svg b/branch-4.3/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.3/_static/img/mascots/scylla-plugin.png b/branch-4.3/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-release-mascot.png b/branch-4.3/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-repair.png b/branch-4.3/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-server.png b/branch-4.3/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-sleeping.png b/branch-4.3/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-tall-measure.png b/branch-4.3/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-university.png b/branch-4.3/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-weights.png b/branch-4.3/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-window-cleaning.png b/branch-4.3/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-with-computer-2.png b/branch-4.3/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-with-computer.png b/branch-4.3/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-with-linux.png b/branch-4.3/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-writting.png b/branch-4.3/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.3/_static/img/menu.svg b/branch-4.3/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.3/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.3/_static/img/scylla-monitor.png b/branch-4.3/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.3/_static/img/scylla-monitor.png differ diff --git a/branch-4.3/_static/js/main.bundle.js b/branch-4.3/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-4.3/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
                      • Back
                      • ',backButtonPosition:"top",wrapper:"
                        ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                          "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                          ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                          ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                          ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                          ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                          "],col:[2,"","
                          "],tr:[2,"","
                          "],td:[3,"","
                          "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + + + +
                          + + + + + +
                          + + +
                          + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/index.html b/branch-4.3/index.html new file mode 100644 index 000000000..75530b364 --- /dev/null +++ b/branch-4.3/index.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          ScyllaDB Monitoring Stack

                          +
                          +
                          +

                          ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                          +_images/monitor.png +

                          The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                          +
                            +
                          • prometheus - collects and stores metrics

                          • +
                          • alertmanager - handles alerts

                          • +
                          • grafana - dashboard server

                          • +
                          +

                          Choose a topic to get started:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/docker_compose.html b/branch-4.3/install/docker_compose.html new file mode 100644 index 000000000..42925efad --- /dev/null +++ b/branch-4.3/install/docker_compose.html @@ -0,0 +1,825 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Using Docker Compose

                          +

                          Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                          +

                          Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                          +
                          +

                          Warning

                          +

                          docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                          +
                          +
                          +

                          Prerequisite

                          +

                          Make sure you have docker and docker-compose installed.

                          +
                          +
                          +

                          Setting Prometheus

                          +

                          The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                          +

                          You can use ./prometheus-config.sh to generate the file, for example:

                          +
                          ./prometheus-config.sh --compose
                          +
                          +
                          +

                          For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                          +
                          +
                          +

                          Setting Grafana Provisioning

                          +

                          Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                          +
                          +

                          Grafana Data-Source file

                          +

                          Run the following command to update the datasource:

                          +
                          ./grafana-datasource.sh --compose
                          +
                          +
                          +

                          You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                          +
                          +
                          +

                          Grafana Dashboard Load file

                          +

                          To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                          +
                          ./generate-dashboards.sh -t -v 2020.1
                          +
                          +
                          +

                          This command generates the files under: grafana/provisioning/dashboards/

                          +
                          +
                          +
                          +

                          Docker Compose file

                          +

                          You can use the following example as a base for your docker compose.

                          +

                          Pass the following to a file called docker-compose.yml

                          +
                          services:
                          +  alertmanager:
                          +    container_name: aalert
                          +    image: prom/alertmanager:v0.21.0
                          +    ports:
                          +    - 9093:9093
                          +    volumes:
                          +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                          +  grafana:
                          +    container_name: agraf
                          +    environment:
                          +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                          +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                          +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                          +    # This is where you set Grafana security
                          +    - GF_AUTH_BASIC_ENABLED=false
                          +    - GF_AUTH_ANONYMOUS_ENABLED=true
                          +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                          +    - GF_SECURITY_ADMIN_PASSWORD=admin
                          +    image: grafana/grafana:7.3.5
                          +    ports:
                          +    - 3000:3000
                          +    user: 1000:1000
                          +    volumes:
                          +    - ./grafana/build:/var/lib/grafana/dashboards
                          +    - ./grafana/plugins:/var/lib/grafana/plugins
                          +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                          +    # Uncomment the following line for grafana persistency
                          +    # - path/to/grafana/dir:/var/lib/grafana
                          +  loki:
                          +    command:
                          +    - --config.file=/mnt/config/loki-config.yaml
                          +    container_name: loki
                          +    image: grafana/loki:2.0.0
                          +    ports:
                          +    - 3100:3100
                          +    volumes:
                          +    - ./loki/rules:/etc/loki/rules
                          +    - ./loki/conf:/mnt/config
                          +  promotheus:
                          +    command:
                          +    - --config.file=/etc/prometheus/prometheus.compose.yml
                          +    container_name: aprom
                          +    image: prom/prometheus:v2.18.1
                          +    ports:
                          +    - 9090:9090
                          +    volumes:
                          +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                          +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                          +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                          +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                          +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                          +    # Uncomment the following line for prometheus persistency 
                          +    # - path/to/data/dir:/prometheus/data
                          +  promtail:
                          +    command:
                          +    - --config.file=/etc/promtail/config.yml
                          +    container_name: promtail
                          +    image: grafana/promtail:2.0.0
                          +    ports:
                          +    - 1514:1514
                          +    - 9080:9080
                          +    volumes:
                          +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                          +version: '3'
                          +
                          +
                          +
                          +

                          Start and Stop

                          +

                          To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/index.html b/branch-4.3/install/index.html new file mode 100644 index 000000000..e1cddfc85 --- /dev/null +++ b/branch-4.3/install/index.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Download and Install Scylla Monitoring Stack

                          +
                          +
                          +

                          Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                          +

                          Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/min-prod-hw.html b/branch-4.3/install/min-prod-hw.html new file mode 100644 index 000000000..ce7eeb851 --- /dev/null +++ b/branch-4.3/install/min-prod-hw.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Minimal Production System Recommendations

                          +
                            +
                          • CPU - at least 2 physical cores/ 4vCPUs

                          • +
                          • Memory - 15GB+ DRAM and proportional to the number of cores.

                          • +
                          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                          • +
                          • Network - 1GbE/10GbE preferred

                          • +
                          +
                          +

                          Calculating Prometheus Minimal Disk Space requirement

                          +

                          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                          +

                          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                          +

                          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                          +
                          6 * 16 * 15 * 12MB ~ 16GB
                          +
                          +
                          +

                          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                          +
                          +
                          +

                          Calculating Prometheus Minimal Memory Space requirement

                          +

                          Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                          +

                          For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                          + +
                          + +++++++ + + + +
                          # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                          00
                          + +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/monitor_without_docker.html b/branch-4.3/install/monitor_without_docker.html new file mode 100644 index 000000000..f55cc0981 --- /dev/null +++ b/branch-4.3/install/monitor_without_docker.html @@ -0,0 +1,1170 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Deploying Scylla Monitoring Stack Without Docker

                          +
                          +

                          Introduction

                          +

                          The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                          +

                          Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                          +

                          Scylla Monitoring uses the following components:

                          +
                            +
                          • Alertmanager

                          • +
                          • Grafana Loki

                          • +
                          • Prometheus

                          • +
                          • Grafana

                          • +
                          +

                          The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                          +

                          We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                          +
                          +
                          +

                          Minimal Production System Recommendations

                          +
                            +
                          • CPU - at least 2 physical cores/ 4vCPUs

                          • +
                          • Memory - 15GB+ DRAM and proportional to the number of cores.

                          • +
                          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                          • +
                          • Network - 1GbE/10GbE preferred

                          • +
                          +
                          +

                          Calculating Prometheus Minimal Disk Space requirement

                          +

                          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                          +

                          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                          +

                          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                          +
                          6 * 16 * 15 * 12MB ~ 16GB
                          +
                          +
                          +

                          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                          +
                          +
                          +

                          Calculating Prometheus Minimal Memory Space requirement

                          +

                          Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                          +

                          For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                          + +
                          + +++++++ + + + +
                          # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                          00
                          + +
                          +

                          The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                          +
                          +

                          Note

                          +

                          Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                          +
                          +
                          +
                          +
                          +

                          Install Scylla Monitoring Stack

                          +

                          The following procedure uses a CentOS 7 based instance

                          +
                            +
                          1. Download the latest Scylla Monitoring Stack release.

                          2. +
                          +
                          wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.3.4.tar.gz
                          +
                          +
                          +
                            +
                          1. Open the tar

                          2. +
                          +

                          tar -xvf scylla-monitoring-*.tar.gz

                          +
                          +
                          +

                          Install Alertmanager

                          +

                          Tested with alertmanager 0.22.2 version

                          +
                            +
                          1. Install alertmanager

                          2. +
                          +
                          wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                          +tar -xvf alertmanager-*.linux-amd64.tar.gz
                          +
                          +
                          +
                            +
                          1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                          2. +
                          +

                          For example:

                          +
                          cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.3.4/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                          +
                          +
                          +
                            +
                          1. Start the Alertmanager

                          2. +
                          +

                          For example:

                          +
                          cd alertmanager-0.22.2.linux-amd64
                          +./alertmanager
                          +
                          +
                          +
                            +
                          1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                          2. +
                          +

                          For example:

                          +
                          http://192.168.135.166:9093/
                          +
                          +
                          +../_images/alertmanager.png +
                          +
                          +

                          Install Grafana Loki

                          +

                          Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                          +

                          We recomand using Loki with containers, but you can install it locally as described in Loki installation

                          +

                          You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                          +

                          Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                          +

                          Loki Related files

                          +

                          Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                          +
                          mkdir -p /etc/loki/rules
                          +mkdir -p /etc/loki/config
                          +cp loki/rules/* /etc/loki/rules
                          +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                          +
                          +
                          +

                          Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                          +

                          Promtail Related files

                          +

                          Promtail has a configuration file. You need to copy and modify the configuration.

                          +
                          mkdir -p /etc/promtail/
                          +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                          +
                          +
                          +

                          Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                          +
                          +
                          +

                          Install Prometheus

                          +

                          Tested with Prometheus version 2.27.1

                          +
                          +

                          Note

                          +

                          If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                          +
                          +
                            +
                          1. Install Prometheus

                          2. +
                          +
                          wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                          +tar -xvf prometheus-*.linux-amd64.tar.gz
                          +
                          +
                          +

                          2. Create Data and Config directories +.. code-block:: shell

                          +
                          +

                          mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                          +
                          +
                            +
                          1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                          2. +
                          +

                          Copy prometheus/prometheus.yml.template to prometheus.yml

                          +

                          For example:

                          +
                          cp scylla-monitoring-scylla-monitoring-4.3.4/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                          +cp scylla-monitoring-scylla-monitoring-4.3.4/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                          +
                          +
                          +
                            +
                          1. Edit the prometheus.yml file to point to the correct static data sources.

                          2. +
                          +
                          +

                          Note

                          +

                          Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                          +
                          +
                          vi /etc/prometheus/prometheus.yml
                          +
                          +
                          +

                          Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                          +

                          For example if the alertmanager will run on the same host:

                          +
                          alerting:
                          +   alertmanagers:
                          +   - static_configs:
                          +       - targets:
                          +           - 127.0.0.1:9093
                          +
                          +
                          +

                          Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                          +

                          For example the scrape config for Scylla:

                          +
                          global:
                          +  scrape_interval: 5s # By default, scrape targets every 5 second.
                          +  scrape_timeout: 4s # Timeout before trying to scape a target again
                          +
                          +  # Attach these labels to any time series or alerts when communicating with
                          +  # external systems (federation, remote storage, Alertmanager).
                          +  external_labels:
                          +    monitor: 'scylla-monitor'
                          +
                          +scrape_configs:
                          +- job_name: scylla
                          +  honor_labels: false
                          +  file_sd_configs:
                          +    - files:
                          +      - /etc/scylla.d/prometheus/scylla_servers.yml
                          +  relabel_configs:
                          +    - source_labels: [__address__]
                          +      regex:  '([^:]+)'
                          +      target_label: __address__
                          +      replacement: '${1}:9180'
                          +
                          +    - source_labels: [__address__]
                          +      regex:  '(.*):.+'
                          +      target_label: instance
                          +      replacement: '${1}'
                          +
                          +
                          +
                            +
                          1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                          2. +
                          +
                          +

                          Note

                          +

                          There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                          +
                          +

                          An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                          +
                          +

                          Note

                          +

                          You must have both files even if you are not using Scylla Manager

                          +
                          +

                          Add the labels for the cluster and data-center

                          +

                          scylla_servers.yml:

                          +

                          For example:

                          +
                          cat scylla_servers.yml
                          +# List Scylla end points
                          +
                          +- targets:
                          +  - 192.168.66.6
                          +  - 192.168.66.244
                          +  labels:
                          +    cluster: cluster1
                          +    dc: dc1
                          +- targets:
                          +    - 172.17.0.3
                          +  labels:
                          +    cluster: cluster1
                          +    dc: dc2
                          +
                          +
                          +
                          +

                          Note

                          +

                          See the previous note about deprecating the node_exporter_servers.yml file.

                          +
                          +

                          scylla_manager_server.yml

                          +

                          For example:

                          +
                          - targets:
                          +  - 127.0.0.1:5090
                          +
                          +
                          +
                            +
                          1. Start Prometheus server:

                          2. +
                          +

                          For example:

                          +
                          cd scylla-monitoring-scylla-monitoring-4.3.4/
                          +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                          +
                          +
                          +

                          Data should start accumulate on: /prometheus/data

                          +
                            +
                          1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                          2. +
                          +

                          For example:

                          +
                          http://192.168.135.166:9090/
                          +
                          +
                          +../_images/1.png +

                          Prometheus console should be visible

                          +
                            +
                          1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                          2. +
                          +

                          For example:

                          +

                          node_memory_MemFree

                          +../_images/2.png +

                          And

                          +

                          scylla_reactor_utilization

                          +../_images/3.png +

                          At this point Scylla is emitting the metrics and Prometheus is able to store them.

                          +
                          +
                          +

                          Install Grafana

                          +

                          Tested with Grafna 7.5.7

                          +
                            +
                          1. Install Grafana based on the instructions here

                          2. +
                          +

                          Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                          +
                            +
                          1. Access Scylla-Grafana-monitoring directory

                          2. +
                          +
                          cd scylla-monitoring-scylla-monitoring-4.3.4/
                          +
                          +
                          +
                            +
                          1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                          2. +
                          +
                          sudo cp -r grafana/plugins /var/lib/grafana/
                          +
                          +
                          +

                          If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                          +

                          For example:

                          +
                          cp -r grafana/plugins ../grafana-7.5.7/public/app
                          +
                          +
                          +
                            +
                          1. Provision the Dashboards

                          2. +
                          +

                          For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                          +

                          For Grafana installed with yum install

                          +
                          sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                          +sudo mkdir -p /var/lib/grafana/dashboards
                          +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                          +
                          +
                          +

                          For Grafana installed from packages

                          +
                          cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                          +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                          +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                          +
                          +
                          +

                          Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                          +
                          +

                          Note

                          +

                          A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                          +
                          +
                            +
                          1. Set the data source by copy datasource.yml and edit it

                          2. +
                          +
                          sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                          +
                          +
                          +
                          +

                          Note

                          +

                          Scylla uses a plugin to read from some system tables see the section below about using it.

                          +
                          +

                          For Grafana installed from packages

                          +
                          cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                          +
                          +
                          +

                          You should set the Prometheus and the alertmanager IP and port.

                          +

                          For example

                          +
                          sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                          +apiVersion: 1
                          +datasources:
                          + - name: prometheus
                          +   type: prometheus
                          +   url: http://192.168.135.167:9090
                          +   access: proxy
                          +   basicAuth: false
                          +
                          + - name: alertmanager
                          +   type: camptocamp-prometheus-alertmanager-datasource
                          +   orgId: 1
                          +   typeLogoUrl: public/img/icn-datasource.svg
                          +   access: proxy
                          +   url: http://192.168.135.166:9093
                          +   password:
                          +   user:
                          +   database:
                          +   basicAuth:
                          +   isDefault:
                          +   jsonData:
                          +     severity_critical: '4'
                          +     severity_high: '3'
                          +     severity_warning: '2'
                          +     severity_info: '1'
                          +
                          +
                          +
                            +
                          1. Start the Grafana service

                          2. +
                          +

                          For Grafana installed with yum install

                          +

                          sudo service grafana-server start

                          +

                          For Grafana installed from packages:

                          +

                          cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                          +

                          Edit scylla.ini to reflect the right paths in the paths section of the file.

                          +
                          plugins = /home/centos/grafana-7.5.7/data/plugins
                          +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                          +
                          +
                          +

                          Start the server:

                          +
                          cd /home/centos/grafana-7.5.7/
                          +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                          +
                          +
                          +
                            +
                          1. Make sure Grafana is running

                          2. +
                          +

                          Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                          +../_images/grafana.png +
                          +
                          +

                          Using Scylla Plugin with Grafana

                          +

                          Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                          +

                          Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                          +
                          +

                          Setting a monitoring user

                          +

                          This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                          +
                            +
                          • If you have not done so, enable authorization first.

                          • +
                          • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                          • +
                          • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                          • +
                          +
                          +
                          +

                          Installing the Plugin

                          +

                          Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                          +
                          +
                          +

                          Configure the Plugin

                          +

                          Add an entry to the datasource.yml file

                          +
                          - name: scylla-datasource
                          +  type: scylladb-scylla-datasource
                          +  orgId: 1
                          +  isDefault:
                          +  jsonData:
                          +  host: ''
                          +#  secureJsonData:
                          +#    user: 'scylla_monitoring'
                          +#    password: 'scylla_monitoring'
                          +
                          +
                          +

                          As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                          +
                          +
                          +

                          Enable the Plugin

                          +

                          Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                          +

                          See more about it the Grafana configurtion.

                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/monitoring_stack.html b/branch-4.3/install/monitoring_stack.html new file mode 100644 index 000000000..89e00a25b --- /dev/null +++ b/branch-4.3/install/monitoring_stack.html @@ -0,0 +1,1105 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Install Scylla Monitoring Stack

                          +

                          This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API

                          +

                          The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                          +

                          For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                          +
                          +

                          Minimal Production System Recommendations

                          +
                            +
                          • CPU - at least 2 physical cores/ 4vCPUs

                          • +
                          • Memory - 15GB+ DRAM and proportional to the number of cores.

                          • +
                          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                          • +
                          • Network - 1GbE/10GbE preferred

                          • +
                          +
                          +

                          Calculating Prometheus Minimal Disk Space requirement

                          +

                          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                          +

                          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                          +

                          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                          +
                          6 * 16 * 15 * 12MB ~ 16GB
                          +
                          +
                          +

                          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                          +
                          +
                          +

                          Calculating Prometheus Minimal Memory Space requirement

                          +

                          Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                          +

                          For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                          + +
                          + +++++++ + + + +
                          # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                          00
                          + +
                          +
                          +
                          +
                          +

                          Prerequisites

                          +
                            +
                          • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                          • +
                          • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                          • +
                          + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          Scylla Monitoring Stack Compatibility Matrix

                          Scylla Monitoring Stack Version

                          Prometheus Version

                          Grafana Version

                          4.3

                          2.42.0

                          9.3.8

                          4.2

                          2.41.0

                          9.3.4

                          4.1

                          2.38.0

                          9.1.0

                          4.0

                          2.34.0

                          8.5.2

                          3.11

                          2.32.0

                          8.3.4

                          3.10

                          2.32.0

                          8.3.3

                          3.9.2

                          2.29.1

                          8.2.7

                          3.9

                          2.29.1

                          8.1.1

                          3.8

                          2.27.1

                          7.5.7

                          3.7

                          2.25.2

                          7.4.0

                          3.6

                          2.18.1

                          7.3.5

                          3.5

                          2.18.1

                          7.1.5

                          3.4

                          2.18.1

                          6.7.3

                          +
                          +
                          +

                          Docker Post Installation

                          +

                          Docker post installation guide can be found here

                          +
                          +

                          Note

                          +

                          Avoid running the container as root.

                          +
                          +

                          To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                          +
                            +
                          1. Create the Docker group.

                          2. +
                          +
                          sudo groupadd docker
                          +
                          +
                          +
                            +
                          1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                          2. +
                          +
                          sudo usermod -aG docker $USER
                          +
                          +
                          +
                            +
                          1. Start Docker by calling:

                          2. +
                          +
                          sudo systemctl enable docker
                          +
                          +
                          +
                          +
                          +

                          Install Scylla Monitoring Stack

                          +

                          Procedure

                          +
                            +
                          1. Download and extract the latest Scylla Monitoring Stack binary;.

                          2. +
                          +
                          wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.3.4.tar.gz
                          +tar -xvf scylla-monitoring-4.3.4.tar.gz
                          +cd scylla-monitoring-scylla-monitoring-4.3.4
                          +
                          +
                          +

                          As an alternative, you can clone and use the Git repository directly.

                          +
                          git clone https://github.com/scylladb/scylla-monitoring.git
                          +cd scylla-monitoring
                          +git checkout branch-4.3
                          +
                          +
                          +
                            +
                          1. Start Docker service if needed

                          2. +
                          +
                          sudo systemctl restart docker
                          +
                          +
                          +
                          +
                          +

                          Configure Scylla Monitoring Stack

                          +

                          To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                          +

                          This configuration can be done from files, or using the Consul api.

                          +

                          Scylla Manager 2.0 and higher supports the Consul API.

                          +
                          +

                          Configure Scylla nodes from files

                          +
                            +
                          1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                          2. +
                          +
                          +

                          Note

                          +

                          It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                          +
                          +

                          For example:

                          +
                          - targets:
                          +      - 172.17.0.2
                          +      - 172.17.0.3
                          +  labels:
                          +      cluster: cluster1
                          +      dc: dc1
                          +
                          +
                          +
                          +

                          Note

                          +

                          If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                          +
                          +

                          Using IPV6

                          +

                          To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                          +

                          For example:

                          +
                          - targets:
                          +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                          +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                          +  labels:
                          +      cluster: cluster1
                          +      dc: dc1
                          +
                          +
                          +
                          +

                          Note

                          +

                          For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                          +
                          +

                          For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                          +
                          +

                          Note

                          +

                          By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                          +
                          +

                          If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                          +

                          For example:

                          +
                          ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                          +
                          +
                          +

                          Mark the different Data Centers with Labels.

                          +

                          As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                          +

                          You can use the genconfig.py script to generate the server file. For example:

                          +
                          ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                          +
                          +
                          +

                          This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                          +

                          OR

                          +

                          The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                          +
                          nodetool status | ./genconfig.py -NS
                          +
                          +
                          +

                          2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                          +

                          You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                          +

                          For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                          +
                          # List Scylla Manager end points
                          +
                          +- targets:
                          +  - 172.17.0.7:5090
                          +
                          +
                          +

                          Note that you do not need to add labels to the Scylla Manager targets.

                          +
                          +
                          +

                          Configure Scylla nodes using Scylla-Manager Consul API

                          +

                          Scylla Manager 2.0 has a Consul like API.

                          +

                          When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                          +

                          For example:

                          +
                          ./start-all.sh -L 10.10.0.1
                          +
                          +
                          +
                          +

                          Note

                          +

                          If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                          +
                          +
                          +
                          +

                          Connecting Scylla-Monitoring to ScyllaDB

                          +

                          Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                          +

                          You can limit the user to read only, currently it only read table from the system keyspace.

                          +

                          You can set a user and password from a file or environment variables.

                          +

                          If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                          +

                          To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                          +
                          +

                          Note

                          +

                          It is best to use a dedicated user and password with limited privileges.

                          +
                          +
                          +
                          +

                          Use an external directory for the Prometheus data directory

                          +

                          The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                          +
                          +

                          Note

                          +

                          Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                          +
                          +

                          If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                          +

                          In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                          +
                          +
                          +

                          Add Additional Prometheus Targets

                          +

                          There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                          +

                          The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                          +

                          You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                          +
                          - job_name: 'myservice'
                          +  # Override the global default and scrape targets from this job every 5 seconds.
                          +  scrape_interval: 5s
                          +  static_configs:
                          +    - targets:
                          +      - 17.0.0.1:7000
                          +
                          +
                          +
                          +
                          +
                          +

                          Start and Stop Scylla Monitoring Stack

                          +
                          +

                          Start

                          +
                          ./start-all.sh -d prometheus_data
                          +
                          +
                          +
                          +
                          +

                          Stop

                          +
                          ./kill-all.sh
                          +
                          +
                          +
                          +
                          +

                          Start a Specific Scylla Monitoring Stack Version

                          +

                          By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                          +

                          You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                          +

                          Multiple versions are supported. For example:

                          +
                          ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                          +
                          +
                          +

                          will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                          +
                          +
                          +

                          Accessing the localhost

                          +

                          The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                          +
                          ./start-all.sh -l -d prometheus-data
                          +
                          +
                          +
                          +
                          +

                          Configure rsyslog on each Scylla node

                          +

                          generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                          +

                          Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                          +

                          Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                          +

                          If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                          +
                          if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                          +
                          +
                          +

                          Restart rsyslog for the configuration to take effect.

                          +
                          systemctl restart rsyslog
                          +
                          +
                          +
                          +
                          +
                          +

                          View Grafana Dashboards

                          +

                          Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/start_all.html b/branch-4.3/install/start_all.html new file mode 100644 index 000000000..5d9b49e1a --- /dev/null +++ b/branch-4.3/install/start_all.html @@ -0,0 +1,766 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          The start-all.sh Command

                          +

                          Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                          +

                          The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                          +
                          +

                          General Options

                          +

                          -h Help, Print the help, and exit.

                          +

                          –version print the current Scylla-Monitoring stack version, and exit.

                          +

                          -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                          +

                          -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                          +

                          -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                          +

                          –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                          +
                          + + +
                          +

                          Alert Manager

                          +

                          The Alertmanager handles the alerts and takes the following parameters:

                          +

                          -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                          +

                          -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                          +

                          -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/thanos.html b/branch-4.3/install/thanos.html new file mode 100644 index 000000000..9ca61aadf --- /dev/null +++ b/branch-4.3/install/thanos.html @@ -0,0 +1,768 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Using Thanos as Data Source With Scylla Monitoring Stack

                          +

                          Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                          +
                            +
                          • High-availability.

                          • +
                          • Horizontal scaling.

                          • +
                          • Backup.

                          • +
                          +

                          The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                          +

                          The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                          +
                          +

                          Using Thanos As a Prometheus Aggregator

                          +

                          There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                          +
                          +

                          Prometheus Configuration

                          +

                          We will assume you have two Prometheus servers running.

                          +
                            +
                          1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                          2. +
                          3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                          4. +
                          +
                          +
                          +

                          Thanos sidecar

                          +

                          The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                          +
                          docker run -d \
                          + -v /path/to/prom/dir:/data/prom:z \
                          + -i --name sidecar thanosio/thanos \
                          + sidecar \
                          + --grpc-address=0.0.0.0:10911 \
                          + --grpc-grace-period=1s \
                          + --http-address=0.0.0.0:10912 \
                          + --http-grace-period=1s \
                          + --prometheus.url=http://prometheus-ip:9090 \
                          + --tsdb.path=/data/prom \
                          + -p 10912:10912 \
                          + -p 10911:10911
                          +
                          +
                          +

                          After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                          +
                          +
                          +

                          Thanos query

                          +

                          Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                          +
                          docker run -d \
                          + --name thanos -- thanosio/thanos \
                          +   query \
                          +   --debug.name=query0 \
                          +   --log.level=debug \
                          +   --grpc-address=0.0.0.0:10903 \
                          +   --grpc-grace-period=1s \
                          +   --http-address=0.0.0.0:10904 \
                          +   --http-grace-period=1s \
                          +   --query.replica-label=prometheus \
                          +   --store={ip1}:10911 --store={ip2}:10911
                          +
                          +
                          +

                          After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                          +
                          +
                          +

                          Update Scylla Data source

                          +

                          The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                          +

                          The file you edit is a template file that replaces the file Grafana uses, next time you start.

                          +

                          Restart the Scylla Monitoring Stack it should now use Thanos.

                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/intro.html b/branch-4.3/intro.html new file mode 100644 index 000000000..362b0bb9e --- /dev/null +++ b/branch-4.3/intro.html @@ -0,0 +1,717 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          ScyllaDB Monitoring Stack

                          +

                          ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                          +_images/monitor.png +

                          The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                          +
                            +
                          • prometheus - Collects and stores metrics

                          • +
                          • grafan-loki - Parses logs and generates metrics and alerts

                          • +
                          • alertmanager - Handles alerts

                          • +
                          • grafana - Dashboards server

                          • +
                          +

                          A few optional components are used for additional services

                          +
                            +
                          • grafana-image-renderer - Allows you to download a dashboard as an image.

                          • +
                          • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                          • +
                          +
                          +

                          High Level Architecture

                          +_images/monitoring_stack1.png +

                          We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                          +

                          We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                          +

                          The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                          +

                          We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                          +

                          Choose a topic to get started:

                          + +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/objects.inv b/branch-4.3/objects.inv new file mode 100644 index 000000000..4824b5791 Binary files /dev/null and b/branch-4.3/objects.inv differ diff --git a/branch-4.3/procedures/alerts/alerting.html b/branch-4.3/procedures/alerts/alerting.html new file mode 100644 index 000000000..4dfd4bd65 --- /dev/null +++ b/branch-4.3/procedures/alerts/alerting.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Alerting

                          +

                          Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                          +

                          You can read more about Prometheus alerting here

                          +

                          By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                          +

                          In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                          +

                          The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                          +../../_images/monitoring_stack.png +
                          +

                          Prometheus Alerts

                          +

                          The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                          +

                          Each alert consists of:

                          +
                            +
                          • Name

                          • +
                          • What happened

                          • +
                          • For how long

                          • +
                          • What to report

                          • +
                          +

                          For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                          +
                          - alert: InstanceDown
                          +  expr: up == 0
                          +  for: 60s
                          +  labels:
                          +    severity: "2"
                          +  annotations:
                          +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                          +    summary: Instance {{ $labels.instance }} down
                          +
                          +
                          +

                          The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                          +

                          The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                          +

                          The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                          +

                          annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                          +
                          +
                          +

                          Alertmanager

                          +

                          The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                          +

                          The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                          +
                            +
                          • Routes: Represent a routing tree, the most specific rule, wins

                          • +
                          • Inhibition: Mute an alert, based on another alert

                          • +
                          • Receiver: Send a notification via email, sluck, etc’

                          • +
                          +

                          Check the Alertmanager documentation for details on how to specify a specific receiver.

                          +

                          In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                          +
                          +
                          +

                          Tips When Adding an Alert

                          +

                          It’s worse having an alert that does not work, than not having an alert at all

                          +

                          There are multiple ways you can use to make sure your alert is set correctly:

                          +
                            +
                          • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                          • +
                          • Force the alert to be active by reducing the limits or the duration.

                          • +
                          • When possible simulate the actual scenario and see that the alert works as expected.

                          • +
                          +

                          For example, low available disk space.

                          +

                          Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                          +

                          Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                          +

                          Starting with a simple working expression helps you bisect problems.

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/procedures/alerts/index.html b/branch-4.3/procedures/alerts/index.html new file mode 100644 index 000000000..811a966cc --- /dev/null +++ b/branch-4.3/procedures/alerts/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Stack Alert Manager

                          +
                          +
                          +

                          Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/procedures/datadog/index.html b/branch-4.3/procedures/datadog/index.html new file mode 100644 index 000000000..08092c76c --- /dev/null +++ b/branch-4.3/procedures/datadog/index.html @@ -0,0 +1,759 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Datadog Integration

                          +

                          The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                          +
                            +
                          1. Installing and configuring the Datadog Agent.

                          2. +
                          3. Add datadog recording rules.

                          4. +
                          5. Loading Scylla dashboard to Datadog.

                          6. +
                          7. Optionally load Monitor (Alerts).

                          8. +
                          +
                          +

                          Note

                          +

                          Scylla Cloud users, use and update the proper configuration file.

                          +
                          +
                          +

                          Install And configure the Datadog Agent

                          +

                          Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                          +

                          Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                          +
                          +

                          Scylla Cloud Users

                          +

                          Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                          +

                          Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                          +
                          +
                          +

                          Other Scylla Users

                          +

                          Other Scylla users, download the configuration file conf.yaml and replace the ip address of the promemtheus server.

                          +
                          +
                          +

                          Post configuration

                          +

                          Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                          +
                          +

                          Note

                          +

                          By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                          +
                          +
                          +
                          +
                          +

                          Add datadog recording rules

                          +

                          Non cloud users, download the rules configuration file datadog.rules.yml and place it under prometheus/prom_rules/.

                          +
                          +
                          +

                          Upload the Dashboard

                          +

                          Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                          +
                          +
                          +

                          Using the Dashboard

                          +

                          We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                          +../../_images/datadog.png +

                          The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                          +
                          +

                          Note

                          +

                          Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                          +
                          +
                          +
                          +

                          Adding Monitor

                          +

                          Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/procedures/index.html b/branch-4.3/procedures/index.html new file mode 100644 index 000000000..3e1e103f1 --- /dev/null +++ b/branch-4.3/procedures/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          ScyllaDB Monitoring Stack Procedures

                          +
                          +
                          +

                          There are several reference guides available which give additional information. Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/procedures/updating_dashboard.html b/branch-4.3/procedures/updating_dashboard.html new file mode 100644 index 000000000..e66e1095a --- /dev/null +++ b/branch-4.3/procedures/updating_dashboard.html @@ -0,0 +1,973 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Adding and Modifying Dashboards

                          +

                          This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                          +

                          It covers dashboard templates and how to modify them.

                          + +
                          +

                          General Limitations

                          +

                          Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                          +
                          +

                          Consistency Between Restarts

                          +

                          By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                          +
                          +
                          +

                          Consistency Between Upgrades

                          +

                          As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                          +
                          +

                          Note

                          +

                           You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                          +
                          +

                          At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                          +
                          +
                          +
                          +

                          Using Templated Dashboards

                          +

                          Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                          +

                          Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                          +

                          For example a typical graph panel would look like this:

                          +
                          {
                          +    "aliasColors": {},
                          +    "bars": false,
                          +    "datasource": "prometheus",
                          +    "editable": true,
                          +    "error": false,
                          +    "fill": 0,
                          +    "grid": {
                          +        "threshold1": null,
                          +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                          +        "threshold2": null,
                          +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                          +    },
                          +    "gridPos": {
                          +        "h": 6,
                          +        "w": 10,
                          +        "x": 0,
                          +        "y": 4
                          +    },
                          +    "id": 2,
                          +    "isNew": true,
                          +    "legend": {
                          +        "avg": false,
                          +        "current": false,
                          +        "max": false,
                          +        "min": false,
                          +        "show": false,
                          +        "total": false,
                          +        "values": false
                          +    },
                          +    "lines": true,
                          +    "linewidth": 2,
                          +    "links": [],
                          +    "nullPointMode": "connected",
                          +    "percentage": false,
                          +    "pointradius": 5,
                          +    "points": false,
                          +    "renderer": "flot",
                          +    "seriesOverrides": [
                          +        {}
                          +    ],
                          +    "span": 5,
                          +    "stack": false,
                          +    "steppedLine": false,
                          +    "targets": [
                          +        {
                          +            "expr": "sum(node_filesystem_avail) by (instance)",
                          +            "intervalFactor": 1,
                          +            "legendFormat": "",
                          +            "refId": "A",
                          +            "step": 1
                          +        }
                          +    ],
                          +    "timeFrom": null,
                          +    "timeShift": null,
                          +    "title": "Available Disk Size",
                          +    "tooltip": {
                          +        "msResolution": false,
                          +        "shared": true,
                          +        "sort": 0,
                          +        "value_type": "cumulative"
                          +    },
                          +    "transparent": false,
                          +    "type": "graph",
                          +    "xaxis": {
                          +        "show": true
                          +    },
                          +    "yaxes": [
                          +        {
                          +            "format": "percent",
                          +            "logBase": 1,
                          +            "max": 101,
                          +            "min": 0,
                          +            "show": true
                          +        },
                          +        {
                          +            "format": "short",
                          +            "logBase": 1,
                          +            "max": null,
                          +            "min": null,
                          +            "show": true
                          +        }
                          +    ]
                          +}
                          +
                          +
                          +

                          As you can imagine, most panels would have similar values.

                          +

                          To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                          +
                          +

                          The Template Class System

                          +

                          The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                          +

                          The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                          +

                          In the template file, you can also add or override attributes.

                          +

                          The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                          +

                          When generating dashboards, each class will be replaced by its definition.

                          +

                          For example, a row in the type.json is defined as:

                          +
                          {
                          + "base_row": {
                          +     "collapse": false,
                          +     "editable": true
                          + },
                          + "row": {
                          +     "class": "base_row",
                          +     "height": "250px"
                          + }
                          + }
                          +
                          +
                          +

                          Will be used like in a template:

                          +
                          {
                          +     "class": "row",
                          +     "height": "150px",
                          +     "panels": [
                          +     ]
                          +}
                          +
                          +
                          +

                          And the output will be:

                          +
                          {
                          +     "class": "row",
                          +     "collapse": false,
                          +     "editable": true,
                          +     "height": "150px",
                          +     "panels": [
                          +
                          +     ]
                          +}
                          +
                          +
                          +

                          We can see that the template added the panels attribute and that it overrides the height attribute.

                          +
                          +
                          +

                          Panel Example

                          +

                          Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                          +
                          {
                          +     "class": "row",
                          +     "panels": [
                          +         {
                          +             "class": "bytes_panel",
                          +             "span": 3,
                          +             "targets": [
                          +                 {
                          +                     "expr": "sum(node_filesystem_avail) by (instance)",
                          +                     "intervalFactor": 1,
                          +                     "legendFormat": "",
                          +                     "metric": "",
                          +                     "refId": "A",
                          +                     "step": 1
                          +                 }
                          +             ],
                          +             "title": "Available Disk Size"
                          +         }
                          +     ]
                          +}
                          +
                          +
                          +

                          In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                          +

                          You can also see that the span attribute is overridden to set the panel size.

                          +

                          To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                          +
                          +
                          +

                          Grafana Formats and Layouts

                          +

                          The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                          +

                          Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                          +

                          The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                          +

                          To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                          +

                          The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                          +

                          You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                          +

                          gridPos has the following attributes:

                          +
                          {
                          +   "x": 0,
                          +   "y": 0,
                          +   "w": 24,
                          +   "h": 4
                          + }
                          +
                          +
                          +

                          When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                          +
                          {
                          +   "gridPos": {
                          +      "h": 2
                          +    }
                          +}
                          +
                          +
                          +
                          +
                          +

                          Generating the dashboards from templates (generate-dashboards.sh)

                          +
                          +

                          Prerequisite

                          +

                          Python 2.7

                          +

                          make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                          +

                          Use the -h flag to get help information.

                          +

                          You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                          +

                          When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                          +

                          For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                          +

                          .\generate-dashboards.sh -v 2020.1

                          +
                          +

                          Note

                          +

                          generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                          +
                          +
                          +
                          +
                          +

                          Validation

                          +

                          After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                          +

                          Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/reference/index.html b/branch-4.3/reference/index.html new file mode 100644 index 000000000..c962458f1 --- /dev/null +++ b/branch-4.3/reference/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Stack Reference Guide

                          +
                          +
                          +

                          There are several reference guides available which give additional information. Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/reference/matrix.html b/branch-4.3/reference/matrix.html new file mode 100644 index 000000000..2f0be0ff4 --- /dev/null +++ b/branch-4.3/reference/matrix.html @@ -0,0 +1,845 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Stack Support Matrix

                          +

                          The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                          + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                          Scylla Monitoring Stack Version

                          Scylla Open Source Version

                          Scylla Enterprise Version

                          Node_exporter[1] Version

                          Scylla Manager Version

                          4.3

                          5.0,5.1,5.2

                          2020.1, 2021.1, 2022.1, 2022.2

                          1.4.1

                          2.5, 2.6, 3.0

                          4.2

                          4.5,4.6,5.0,5.1

                          2020.1, 2021.1, 2022.1, 2022.2

                          1.4.1

                          2.5, 2.6, 3.0

                          4.1

                          4.5,4.6,5.0,5.1

                          2020.1, 2021.1, 2022.1, 2022.2

                          0.17

                          2.5, 2.6, 3.0

                          4.0

                          4.3, 4.4, 4.5, 4.6, 5.0

                          2020.1, 2021.1, 2022.1

                          0.17

                          2.3, 2.4, 2.5, 2.6, 3.0

                          3.11

                          4.3, 4.4, 4.5, 4.6, 5.0

                          2020.1, 2021.1, 2022.2

                          0.17

                          2.3, 2.4, 2.5, 2.6

                          3.10

                          4.3, 4.4, 4.5, 4.6

                          2020.1, 2021.1

                          0.17

                          2.3, 2.4, 2.5, 2.6

                          3.9

                          4.3, 4.4, 4.5, 4.6

                          2020.1, 2021.1

                          0.17

                          2.3, 2.4, 2.5

                          3.8

                          4.3, 4.4, 4.5

                          2020.1, 2021.1

                          0.17

                          2.3, 2.4, 2.5

                          3.7

                          4.2, 4.3, 4.4

                          2019.1, 2020.1, 2021.1

                          0.17

                          2.2, 2.3

                          3.6.3

                          4.2, 4.3, 4.4

                          2019.1, 2020.1, 2021.1

                          0.17

                          2.2, 2.3, 2.1

                          3.6

                          4.1, 4.2, 4.3

                          2019.1, 2020.1

                          0.17

                          2.1, 2.2, 2.3

                          3.6.1

                          4.1, 4.2, 4.3

                          2019.1, 2020.1

                          0.17

                          2.1, 2.2

                          3.6.1

                          4.1, 4.2, 4.3, 4.4

                          2019.1, 2020.1

                          0.17

                          2.1, 2.2

                          3.5

                          3.3, 4.0, 4.1, 4.2

                          2019.1, 2020.1

                          0.17

                          2.0, 2.1, 2.2

                          3.4.3

                          3.3, 4.0, 4.1, 4.2

                          2019.1, 2020.1

                          0.17

                          2.0, 2.1

                          3.4

                          3.3, 4.0, 4.1

                          2018.1, 2019.1

                          0.17

                          2.0, 2.1

                          3.3

                          3.1, 3.2, 3.3, 4.0

                          2018.1, 2019.1

                          0.17

                          1.4, 2.0, 2.1

                          3.2

                          3.1, 3.2, 3.3

                          2018.1, 2019.1

                          0.17

                          1.4, 2.0

                          3.1

                          2.3, 3.0, 3.1, 3.2

                          2018.1, 2019.1

                          0.17

                          1.3, 1.4, 2.0

                          3.0

                          2.3, 3.0, 3.1, 3.2

                          2018.1, 2019.1

                          0.17

                          1.3, 1.4

                          2.4

                          2.3, 3.0, 3.1

                          2018.1, 2019.1

                          0.14, 0.17

                          1.3, 1.4

                          2.3

                          2.3, 3.0

                          2018.1, 2019.1

                          0.14, 0.17

                          1.3

                          2.2

                          2.3, 3.0

                          2018.1, 2019.1

                          0.14, 0.17

                          1.3

                          2.1

                          2.3, 3.0

                          2018.1

                          0.14, 0.17

                          1.3

                          +

                          [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/reference/monitoring_apis.html b/branch-4.3/reference/monitoring_apis.html new file mode 100644 index 000000000..3a713f485 --- /dev/null +++ b/branch-4.3/reference/monitoring_apis.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Stack Interfaces

                          +

                          Scylla exposes two interfaces for online monitoring, as described below

                          +
                          +

                          Prometheus

                          +

                          By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                          +

                          For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                          +

                          You can change the Prometheus listening address and port in scylla.yaml file

                          +
                          # prometheus port
                          +# By default, Scylla opens prometheus API port on port 9180
                          +# setting the port to 0 will disable the prometheus API.
                          +prometheus_port: 9180
                          +#
                          +# prometheus address
                          +# By default, Scylla binds all interfaces to the prometheus API
                          +# It is possible to restrict the listening address to a specific one
                          +prometheus_address: 0.0.0.0
                          +
                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/robots.txt b/branch-4.3/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.3/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.3/search.html b/branch-4.3/search.html new file mode 100644 index 000000000..cbc78eb7a --- /dev/null +++ b/branch-4.3/search.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + + + +
                          + + + + + +
                          + + +
                          + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/searchindex.js b/branch-4.3/searchindex.js new file mode 100644 index 000000000..8d7c40f3d --- /dev/null +++ b/branch-4.3/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 4, 5, 19, 22, 24, 25, 29, 30, 32, 33, 35, 37, 38], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 26, 27, 28, 29, 32, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 26], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 29, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 19, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 27, 28, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 26, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 27, 34, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 33], "user": [1, 2, 6, 7, 9, 26, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9, 32], "refer": [1, 6, 9, 13], "upgrad": [1, 13], "lesson": [1, 9, 28, 29], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 26, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 19, 21, 22, 23, 24, 25, 29, 31, 33, 34, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 29, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 26, 30, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 31, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 27, 30, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 26, 29, 32, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 14, 19, 21, 22, 23, 24, 25], "onc": [2, 12, 21, 25, 31, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 34, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 32, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 30, 31, 32, 38, 41], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 27, 29, 30, 33, 34, 35, 41], "both": [2, 5, 6, 19, 22, 24, 25, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 26, 39, 41], "updat": [2, 5, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 28, 33, 34, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 34, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 27, 33, 34, 41], "advis": [2, 34], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25], "databas": [2, 5, 7, 21, 29, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 33, 41], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 26, 30, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 32, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 32, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 14, 21, 22, 23, 24, 25, 31, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 12, 14, 16, 19, 21, 22, 24, 25, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 12, 25], "yaml": [2, 5, 12, 17], "To": [2, 4, 5, 6, 12, 14, 17, 21, 22, 23, 24, 25], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "1": [2, 5, 6, 7, 8, 12, 14, 16, 20, 22, 24, 25], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 27, 28, 29, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "21": 2, "0": [2, 5, 6, 7, 8, 10, 14, 16, 17, 21, 22, 23, 24, 25], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 14, 16], "5": [2, 5, 6, 14, 16, 19], "3000": [2, 5, 6, 22, 24, 25], "1000": [2, 33], "build": [2, 5], "plugin": 2, "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 14, 28, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25], "dir": [2, 7, 8, 22, 24, 25], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 10, 12, 14, 16, 20, 24, 35], "3100": [2, 5], "rule": [2, 5, 7, 10, 19, 25, 31, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 27, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 19, 21, 25], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 29, 34, 35, 37, 39, 41], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 19, 21, 33, 39], "section": [4, 5, 6, 12, 19, 21, 24, 25, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 19, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 29, 35, 37, 41], "default": [4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 25, 30, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 19, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25], "scrape": [4, 5, 6], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 38], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 27, 28, 29, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 19, 25, 32, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 27, 29, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 29, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 31, 39, 41], "need": [4, 5, 6, 7, 8, 14, 19, 25, 27, 28, 29, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 27, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 27, 34, 41], "out": [4, 5, 6, 8, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 7, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 26, 29, 41], "take": [4, 5, 6, 7, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25], "help": [5, 7, 10, 14, 41], "pleas": [5, 19], "most": [5, 10, 14, 25, 34, 36, 41], "current": [5, 6, 7, 10, 14, 19, 22, 24, 25], "common": [5, 7, 41], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 19], "standalon": [5, 19], "thei": [5, 6, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25], "consolid": 5, "componen": 5, "suggest": [5, 14, 25], "those": [5, 25], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 27, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 27, 28, 35, 41], "support": [5, 6, 14, 15, 26, 32, 41], "want": [5, 6, 10, 22, 24, 25], "latest": [5, 6, 7, 22, 24, 25], "releas": [5, 21, 22, 23, 24, 25], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25], "http": [5, 6, 8, 19, 21, 22, 24, 25, 29, 30, 32, 38], "com": [5, 6, 22, 24, 25, 29, 30, 32, 38], "archiv": [5, 6, 22, 24, 25], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 19, 21, 22, 23, 24], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25], "p": [5, 7, 8, 19, 21, 22, 24, 25], "home": 5, "cd": [5, 6, 22, 24, 25], "verifi": [5, 23], "point": [5, 6, 14, 22, 24, 25], "browser": [5, 6, 8, 14, 19, 22, 24, 25], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 31, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 12, 19, 25, 26, 29, 30, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 27, 30, 31, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 29, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 14, 26, 27, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25], "scrap": [5, 12], "job": [5, 6, 19], "onli": [5, 6, 7, 19, 21, 23, 25, 29, 31, 33, 39, 41], "import": [5, 6, 7, 12, 21, 22, 24, 25, 33], "record": [5, 7, 19, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25], "code": [5, 34], "shell": 5, "prom_rul": [5, 12, 25], "correct": [5, 23], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 32], "host": [5, 6, 7, 9, 19], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23], "127": [5, 7, 19], "right": [5, 6, 14, 34, 41], "typic": [5, 14, 25, 27, 29, 39, 41], "node_export": [5, 6, 7, 9, 16], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 30, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 19, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7, 19], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 26, 31], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24], "scylla_reactor_util": 5, "At": [5, 14, 24, 25], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 27, 28, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 19, 25, 34, 38], "tabl": [5, 6, 10, 16, 26, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 33, 34, 41], "give": [5, 13, 15], "strongli": 5, "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 26, 29, 34, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 31, 33], "mention": [5, 14], "previous": [5, 24, 25], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 30, 33, 41], "privileg": [5, 6, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 7, 25], "laptop": 6, "42": 6, "9": [6, 16, 25], "8": [6, 16, 19, 21, 25], "41": 6, "38": 6, "34": 6, "11": [6, 16], "32": 6, "10": [6, 10, 14, 16], "29": 6, "25": [6, 19], "avoid": [6, 14, 19, 30, 32, 41], "root": [6, 19, 22, 24, 25], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 22, 24, 25], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 29, 41], "higher": [6, 25, 29, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 26, 27, 28], "agent": [6, 7, 8, 9, 16, 19], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25], "within": [6, 10, 14], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 38], "place": [6, 7, 8, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 27, 29, 30, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25], "2019": [6, 16, 38], "reach": [6, 8, 12, 29, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 29, 30, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 28, 31, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 29, 30, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 26, 27, 28, 29, 30, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 34], "disk": [7, 10, 14, 19, 26, 28, 34], "possibl": [7, 10, 17, 32, 41], "api": [7, 8, 17, 21], "resolv": 7, "explicitli": [7, 14], "request": [7, 17, 34, 40], "how": [7, 8, 10, 14, 22, 24, 25, 27, 28, 29, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 14, 19], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14, 34], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 28], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 27, 28, 29, 34, 35, 41], "abov": [8, 22, 24, 25], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 29, 38, 41], "email": [9, 10], "slack": [9, 10], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11, 34], "wrong": [10, 11, 14, 19, 25, 39, 41], "shown": [10, 19, 22, 24, 25], "overview": [10, 25, 34], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 32, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "sever": [10, 13, 15, 42], "annot": 10, "descript": [10, 34], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 41], "rout": [10, 29, 41], "repres": 10, "tree": 10, "win": [10, 19], "inhibit": 10, "mute": 10, "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 27], "simul": 10, "actual": [10, 37], "low": [10, 41], "space": 10, "lower": [10, 41], "fire": 10, "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 31, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "promemtheu": 12, "shard": [12, 19, 25, 34], "dd": 12, "non": [12, 19, 21, 28, 29, 34, 38, 41], "json": [12, 14], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "explain": [14, 22, 24, 25, 34], "intern": [14, 29, 41], "potenti": [14, 34, 41], "issu": [14, 19, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": [14, 25, 34, 35, 37], "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 30, 41], "tooltip": 14, "msresolut": 14, "share": [14, 33], "sort": [14, 32, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 32, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 30, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 19, 23, 25], "calcul": [14, 19, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "24": [14, 25], "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": [14, 34], "usual": [14, 19, 34, 41], "easier": 14, "wrapper": 14, "re": [14, 29], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2018": [16, 30], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "56090": 19, "old": [19, 22, 23, 24, 25], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "post": 19, "past": [19, 23], "mai": [19, 33, 34, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": [19, 34], "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 29, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 26, 27, 28, 30, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "while": [19, 21, 22, 24, 25, 33], "dure": [19, 22, 24, 25], "fallback": 19, "mechan": [19, 25, 27], "present": [19, 25], "newer": [19, 24, 25], "reli": [19, 25, 41], "miss": [19, 25], "clean": 19, "recommend": [19, 22, 24, 25], "increas": [19, 30, 33, 41], "might": [19, 39], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25], "migrat": [21, 22, 24], "lose": 21, "histor": [21, 25], "process": [21, 33, 40], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25], "3001": [21, 22, 24, 25], "9091": [21, 22, 24, 25], "9094": 21, "fail": [21, 27, 29, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25], "back": [21, 27], "uninstal": [22, 24, 25], "minor": [22, 24, 25], "9095": [22, 24, 25], "brows": [22, 24, 25], "satisfi": [22, 24, 25], "shut": [22, 24, 25], "caus": [22, 24, 25, 29, 41], "blackout": [22, 24, 25], "normal": [22, 24, 25], "oper": [22, 24, 25, 34, 41], "complet": [22, 24, 25], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 34, 41], "ensur": 25, "patch": 25, "skip": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 28], "latenc": [25, 29, 33, 34, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 27], "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 27, 28, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "primari": [26, 41], "kei": [26, 32, 41], "scan": 26, "These": [26, 41], "kind": [26, 41], "bigger": 26, "care": [26, 27, 28, 41], "replicationfactor": [27, 28], "piec": 27, "determin": [27, 28, 35, 41], "repli": [27, 28, 30, 35, 37, 41], "unavail": [27, 41], "client": [27, 30, 34, 41], "respond": 27, "accompani": 27, "deep": 27, "understand": 27, "acknowledg": 28, "coordin": [28, 29, 35, 37, 41], "hint": 28, "fact": 28, "yet": 28, "ideal": [29, 41], "resourc": [29, 32, 41], "replic": [29, 35, 37, 41], "prepar": [29, 34, 38], "statement": [29, 31, 34, 38], "balanc": [29, 33, 34, 41], "polici": 29, "cours": 29, "intro": 29, "recap": 29, "ring": [29, 41], "architectur": 29, "chunk": [30, 41], "overal": [30, 33, 41], "thu": 30, "www": [30, 38], "07": 30, "13": 30, "effici": [30, 41], "optim": [31, 38, 42], "concret": 31, "thumb": 31, "alwai": 31, "favor": 31, "partit": [32, 34], "BY": [32, 41], "ineffici": [32, 41], "consum": 32, "doc": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "practic": [34, 38], "solv": 34, "left": 34, "categori": [34, 41], "jump": 34, "warn": 34, "cell": 34, "model": [34, 38, 40, 41], "imbal": 34, "imbalanc": 34, "hot": 34, "bottleneck": [34, 38], "cach": 34, "hit": 34, "awar": 34, "order": [34, 41], "due": 34, "unsatisfi": 34, "faulti": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "explan": 38, "08": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "shed": 40, "drop": [40, 41], "repair": 40, "que": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "prevent": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "cost": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 13], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 34, 42], "us": [2, 5, 6, 8, 12, 14, 26, 27, 28, 32, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 30, 38], "node": [6, 36], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 34, 41], "all": [7, 22, 24, 25, 27], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 26, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 27, 28, 35, 41], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 12, 14], "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25], "modifi": 14, "limit": 14, "consist": [14, 27, 28, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "latenc": 19, "graph": 19, "ar": [19, 29, 30, 31, 38], "empti": 19, "reduc": 19, "total": 19, "number": 19, "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25], "latest": 21, "new": [21, 22, 23, 24, 25], "4": [21, 25], "move": [21, 22, 24, 25], "old": 21, "b": 21, "rollback": [21, 22, 23, 24, 25], "link": [21, 22, 23, 24, 25, 28, 29, 30, 32, 38], "y": [22, 24, 25], "": [22, 24, 25], "i": [22, 24, 25, 36], "run": [22, 24, 25], "correct": [22, 24, 25], "correctli": [22, 24], "kill": [22, 24, 25], "test": [24, 25], "mode": [24, 25], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "some": [26, 27, 28, 29, 30, 31, 32, 35, 37], "allow": [26, 41], "filter": [26, 41], "ani": 28, "univers": [28, 29], "token": [29, 41], "awar": [29, 41], "select": 30, "non": [30, 31], "page": [30, 41], "blog": [30, 38], "prepar": [31, 39, 41], "revers": [32, 41], "order": 32, "document": 32, "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "Some queries use reverse order": [[32, "some-queries-use-reverse-order"]], "Documentation link": [[32, "documentation-link"]], "Some SELECT queries are non-paged": [[30, "some-select-queries-are-non-paged"]], "Blog-post Links": [[30, "blog-post-links"]], "Some queries are non-prepared": [[31, "some-queries-are-non-prepared"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Upgrade Procedure": [[22, "upgrade-procedure"], [24, "upgrade-procedure"], [21, "upgrade-procedure"], [25, "upgrade-procedure"], [23, "upgrade-procedure"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[22, "setting-the-server-s-files"], [24, "setting-the-server-s-files"], [25, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[22, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[22, "validate-the-version-installed-correctly"], [24, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[22, "kill-all-containers"], [24, "kill-all-containers"], [25, "kill-all-containers"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Related Links": [[22, "related-links"], [24, "related-links"], [21, "related-links"], [25, "related-links"], [23, "related-links"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Rollback to version 3.x": [[24, "rollback-to-version-3-x"], [25, "rollback-to-version-3-x"]], "Some queries use Consistency Level: ANY": [[28, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[28, "link-to-scylla-university"]], "Some queries are not token-aware": [[29, "some-queries-are-not-token-aware"]], "University link": [[29, "university-link"]], "Some queries use ALLOW FILTERING": [[26, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[21, "install-the-new-monitoring-stack"], [23, "install-the-new-monitoring-stack"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Validate the upgrade": [[21, "validate-the-upgrade"], [23, "validate-the-upgrade"]], "Rollback": [[21, "rollback"], [23, "rollback"]], "Some queries use Consistency Level: ALL": [[27, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[17, "prometheus"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[19, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "System Overload": [[40, "system-overload"]], "Minimal Production System Recommendations": [[4, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[4, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[4, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"]], "ScyllaDB Monitoring Stack": [[9, "scylladb-monitoring-stack"], [1, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.3/sitemap.xml b/branch-4.3/sitemap.xml new file mode 100644 index 000000000..492fd5086 --- /dev/null +++ b/branch-4.3/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.3/troubleshooting/index.html b/branch-4.3/troubleshooting/index.html new file mode 100644 index 000000000..29ceed804 --- /dev/null +++ b/branch-4.3/troubleshooting/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Troubleshooting Guide for Scylla Monitoring Stack

                          +
                          +
                          +

                          Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/troubleshooting/monitor_troubleshoot.html b/branch-4.3/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..7ea0a324e --- /dev/null +++ b/branch-4.3/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,900 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Troubleshoot Scylla Monitoring Stack

                          +

                          This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                          +
                          +

                          Problem

                          +
                          +

                          Scylla-Manager 2.2 with Duplicate information

                          +

                          Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                          +
                            +
                          • For Manager server: from 56090 to 5090

                          • +
                          • For Manager Agent: from 56090 to 5090

                          • +
                          +

                          For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                          +

                          However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                          +

                          The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                          +

                          Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                          +
                          +
                          +

                          A Container Fails To Start

                          +

                          When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                          +
                          Wait for Prometheus container to start........Error: Prometheus container failed to start
                          +
                          +
                          +

                          Should this happen, check the Docker logs for more information.

                          +
                          docker logs aprom
                          +
                          +
                          +

                          Usually the reason for the failure is described in the logs.

                          +
                          +
                          +

                          Files And Directory Permissions

                          +
                          +

                          Note

                          +

                          Avoid running Docker containers as root.

                          +
                          +

                          The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                          +

                          If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                          +
                          +

                          Note

                          +

                          If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                          +
                          +

                          For example if your Prometheus data directory is /prom-data and you are using centos user

                          +
                          ls -la /|grep prom-data
                          +
                          +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                          +
                          +sudo chown -R centos:centos /prom-data
                          +
                          +ls -la /|grep prom-data
                          +
                          +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                          +
                          +
                          +
                          +
                          +

                          No Data Points

                          +

                          No data points on all data charts.

                          +
                          +

                          Solution

                          +

                          If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                          +
                            +
                          1. Login to the Prometheus console:

                          2. +
                          3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                          4. +
                          5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                          6. +
                          +
                          +
                            +
                          • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                          • +
                          • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                          • +
                          • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                          • +
                          +
                          +

                          For example:

                          +
                          ./start-all.sh -v 3.1
                          +
                          +
                          +

                          More on start-all.sh options.

                          +
                          +
                          +
                          +

                          Grafana Chart Shows Error (!) Sign

                          +

                          Run this procedure on the Scylla Monitoring Stack server.

                          +

                          If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                          +
                          +

                          Solution

                          +

                          On the Scylla Monitoring Stack server:

                          +
                            +
                          1. Check Prometheus is running using docker ps.

                          2. +
                          +
                            +
                          • If it is not running check the prometheus.yml for errors.

                          • +
                          +

                          For example:

                          +
                          CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                          +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                          +
                          +
                          +
                            +
                          • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                          • +
                          +
                          +
                          +
                          +

                          Grafana Shows Server Level Metrics, but not Scylla Metrics

                          +

                          Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                          +
                          +

                          Solution

                          +
                            +
                          • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                          • +
                          +

                          For example

                          +
                          curl 172.17.0.2:9180/metrics
                          +
                          +
                          +
                          +
                          +
                          +

                          Grafana Shows Scylla Metrics, but not Server Level Metrics

                          +

                          Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                          +
                          +

                          Solution

                          +

                          1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                          +
                            +
                          1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                          2. +
                          +
                          +
                          +

                          Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                          +

                          While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                          +

                          If the node_exporter service is not starting it may need to be updated manually.

                          +

                          Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                          +
                          +
                          +
                          +

                          Latencies Graphs Are empty

                          +

                          Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                          +

                          During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                          +

                          Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                          +

                          If only the latency graphs are missing, it is because of missing recording rules.

                          +

                          This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                          +

                          If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                          +
                          +
                          +

                          Reducing the total number of metrics

                          +

                          In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                          +
                          +

                          Remove interrupts from node_exporter

                          +

                          By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                          +
                          +
                          +
                          +

                          Working with Wireshark

                          +

                          No metrics shown in the Scylla Monitoring Stack.

                          +
                            +
                          1. Install wireshark

                          2. +
                          +

                          2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                          +

                          For example:

                          +
                          tshark -i eth0 -f "dst port 9180"
                          +
                          +
                          +

                          Capture from Scylla node towards Scylla Monitoring Stack server.

                          +

                          In this example, Scylla is running.

                          +
                          Monitor ip        Scylla node ip
                          +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                          +
                          +
                          +

                          In this example, Scylla is not running

                          +
                          Monitor ip        Scylla node ip
                          +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                          +
                          +
                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/index.html b/branch-4.3/upgrade/index.html new file mode 100644 index 000000000..8fb058aef --- /dev/null +++ b/branch-4.3/upgrade/index.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Scylla Monitoring Stack

                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.3/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..06f0b1a1d --- /dev/null +++ b/branch-4.3/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,809 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                          +

                          This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

                          +

                          Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                          +
                          +

                          Upgrade Procedure

                          +
                          +

                          1. Upgrade to the latest 1.x version

                          +

                          Before starting the upgrade procedure, make sure you are running the latest 1.x version

                          +
                          +
                          +

                          2. Install the new monitoring stack

                          +
                            +
                          1. Download the 2.x version from the release page.

                          2. +
                          3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                          4. +
                          5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                            +
                              +
                            • scylla_servers.yml

                            • +
                            • scylla_manager_servers.yml

                            • +
                            • node_exporter_servers.yml

                            • +
                            +
                          6. +
                          7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                          8. +
                          +
                          ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                          +
                          +
                          +
                          +

                          Note

                          +

                          Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                          +
                          +

                          While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                          +
                          ./kill-all.sh -g 3001 -p 9091 -m 9094
                          +
                          +
                          +
                          +

                          Validation

                          +

                          Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                          +
                          +
                          +
                          +

                          3. Alerting Rules

                          +

                          Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                          +
                          +
                          +

                          4. Moving to Prometheus 2.x

                          +

                          Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                          +

                          Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                          +
                          +

                          a. Set the old system

                          +

                          The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                          +
                            +
                          • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                          • +
                          • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                          • +
                          +
                          +

                          Note

                          +

                          After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                          +
                          +
                          +
                          +

                          b. Set the new system

                          +

                          The following step will allow the new monitoring system to read historical metrics from the old system.

                          +
                            +
                          • In the Prometheus prometheus.yml.template file add the following at the end:

                          • +
                          +
                          remote_read:
                          +  - url: "http://{ip}:9111/api/v1/read"
                          +
                          +
                          +

                          Where {ip} is the ip of the old system.

                          +
                            +
                          • restart the new stack

                          • +
                          +
                          +
                          +
                          +

                          Validate the upgrade

                          +

                          You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                          +
                          +
                          +
                          +

                          Rollback

                          +

                          In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                          +
                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..e95a24f64 --- /dev/null +++ b/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,803 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                          +

                          This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                          +
                          +

                          Upgrade Procedure

                          +

                          We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                          +

                          Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                          +
                          +

                          Install 2.y (The new version)

                          +
                          wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                          +unzip scylla-monitoring-2.y.zip
                          +cd scylla-monitoring-scylla-monitoring-2.y/
                          +
                          +
                          +

                          Replace “y” with the new minor release number, for example, 2.1.zip

                          +
                          +
                          +

                          Setting the server’s files

                          +

                          Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                          +
                          cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                          +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                          +
                          +
                          +
                          +
                          +

                          Validate the new version is running the correct version

                          +

                          Starting from Scylla-Monitoring version 2.2, you can run:

                          +
                          ./start-all.sh --version
                          +
                          +
                          +

                          To validate the Scylla-Monitoring version.

                          +
                          +
                          +

                          Validate the version installed correctly

                          +

                          To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                          +
                          ./start-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          Browse to http://{ip}:9091 +And check the Grafana dashboard

                          +

                          Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                          +
                          +

                          Caution

                          +

                          Important: do not use the local dir flag when testing!

                          +
                          +

                          When you are satisfied with the data in the dashboard, you can shut down the containers.

                          +
                          +

                          Caution

                          +

                          Important: Do not kill the 2.x version that is currently running.

                          +
                          +

                          Use the following command to kill the containers:

                          +
                          ./kill-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          You can start and stop the new 2.y version while testing.

                          +
                          +
                          +

                          Move to version 2.y (the new version)

                          +

                          Note: migrating will cause a few seconds of blackout in the system.

                          +

                          We assume that you are using external volume to store the metrics data.

                          +
                          +

                          Kill all containers

                          +

                          Follow the instruction on how to kill the 2.y version when in testing mode.

                          +

                          To kill the 2.x version containers, run:

                          +
                          ./kill-all.sh
                          +
                          +
                          +

                          Start version 2.y in normal mode

                          +

                          From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                          +
                          ./start-all.sh -d /path/to/data/dir
                          +
                          +
                          +

                          Point your browser to http://{ip}:3000 and see that the data is there.

                          +
                          +
                          +
                          +

                          Rollback to version 2.x

                          +

                          To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                          +

                          To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                          +
                          ./kill-all.sh
                          +cd /path/to/scylla-grafana-2.x/
                          +./start-all.sh -d /path/to/data/dir
                          +
                          +
                          +
                          +
                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..efea6d4ef --- /dev/null +++ b/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,767 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                          +

                          This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

                          +

                          Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                          +
                          +

                          Upgrade Procedure

                          +
                          +

                          1. Validate node_exporter version

                          +

                          Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                          +

                          If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                          +
                          +
                          +

                          2. Install the new monitoring stack

                          +
                            +
                          1. Download the 3.x version from the release page.

                          2. +
                          3. Unzip it into a different directory.

                          4. +
                          5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                            +
                              +
                            • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                            • +
                            • scylla_manager_servers.yml

                            • +
                            +
                            +
                            +

                            Note

                            +

                            The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                            +
                            +
                            +
                          6. +
                          7. Stop the old monitoring stack

                            +
                            +
                            ./kill-all.sh
                            +
                            +
                            +
                            +
                          8. +
                          9. Start the new monitoring stack

                            +
                            +
                            ./start-all.sh -d /prometheus-data-path
                            +
                            +
                            +
                            +
                          10. +
                          +
                          +
                          +

                          Validate the upgrade

                          +

                          You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                          +

                          Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                          +
                          +
                          +
                          +

                          Rollback

                          +

                          To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                          +
                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..9c1f16e27 --- /dev/null +++ b/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                          +

                          This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                          +
                          +

                          Upgrade Procedure

                          +

                          We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                          +

                          Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                          +
                          +

                          Install 3.y (The new version)

                          +
                          wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                          +unzip scylla-monitoring-3.y.zip
                          +cd scylla-monitoring-scylla-monitoring-3.y/
                          +
                          +
                          +

                          Replace “y” with the new minor release number, for example, 3.0.1.zip

                          +
                          +
                          +

                          Setting the server’s files

                          +

                          Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                          +
                          cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                          +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                          +
                          +
                          +
                          +
                          +

                          Validate the new version is running the correct version

                          +

                          Starting from Scylla-Monitoring version 2.2, you can run:

                          +
                          ./start-all.sh --version
                          +
                          +
                          +

                          To validate the Scylla-Monitoring version.

                          +
                          +
                          +

                          Validate the version installed correctly

                          +

                          To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                          +
                          ./start-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          Browse to http://{ip}:9091 +And check the Grafana dashboard

                          +

                          Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                          +
                          +

                          Caution

                          +

                          Important: do not use the local dir flag when testing!

                          +
                          +

                          When you are satisfied with the data in the dashboard, you can shut down the containers.

                          +
                          +

                          Caution

                          +

                          Important: Do not kill the 3.x version that is currently running.

                          +
                          +
                          +
                          +

                          Killing the new 3.y Monitoring stack in testing mode

                          +

                          Use the following command to kill the containers:

                          +
                          ./kill-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          You can start and stop the new 3.y version while testing.

                          +
                          +
                          +

                          Move to version 3.y (the new version)

                          +

                          Note: migrating will cause a few seconds of blackout in the system.

                          +

                          We assume that you are using external volume to store the metrics data.

                          +
                          +

                          Kill all containers

                          +

                          At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                          +

                          Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                          +

                          kill the older 3.x version containers by running:

                          +
                          ./kill-all.sh
                          +
                          +
                          +

                          Start version 3.y in normal mode

                          +

                          From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                          +
                          ./start-all.sh -d /path/to/data/dir
                          +
                          +
                          +

                          Point your browser to http://{ip}:3000 and see that the data is there.

                          +
                          +
                          +
                          +

                          Rollback to version 3.x

                          +

                          To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                          +

                          To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                          +
                          ./kill-all.sh
                          +cd /path/to/scylla-grafana-3.x/
                          +./start-all.sh -d /path/to/data/dir
                          +
                          +
                          +
                          +
                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..451245243 --- /dev/null +++ b/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,954 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                          +

                          This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                          +
                          +

                          Upgrade Procedure

                          +

                          We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                          +

                          Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                          +
                          +

                          Install 4.y (The new version)

                          +
                          wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                          +unzip scylla-monitoring-4.y.zip
                          +cd scylla-monitoring-scylla-monitoring-4.y/
                          +
                          +
                          +

                          Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                          +
                          +
                          +

                          Setting the server’s files

                          +

                          Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                          +
                          cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                          +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                          +
                          +
                          +
                          +
                          +

                          Validate the new version is running the correct version

                          +

                          run:

                          +
                          ./start-all.sh --version
                          +
                          +
                          +

                          To validate the Scylla-Monitoring version.

                          +
                          +
                          +
                          +

                          Running in test mode

                          +

                          This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                          +
                          +

                          Running second monitoring stack

                          +

                          We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                          +
                          ./start-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          Browse to http://{ip}:9091 and check the Grafana dashboard.

                          +

                          Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                          +
                          +

                          Caution

                          +

                          Important: do not use the local dir flag when testing!

                          +
                          +

                          When you are satisfied with the data in the dashboard, you can shut down the containers.

                          +
                          +

                          Caution

                          +

                          Important: Do not kill the 3.x version that is currently running!

                          +
                          +
                          +
                          +

                          Killing the new 4.y Monitoring stack in testing mode

                          +

                          Use the following command to kill the containers:

                          +
                          ./kill-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          You can start and stop the new 4.y version while testing.

                          +
                          +
                          +
                          +

                          Migrating

                          +
                          +

                          Move to version 4.y (the new version)

                          +

                          Note: migrating will cause a few seconds of blackout in the system.

                          +

                          We assume that you are using external volume to store the metrics data.

                          +
                          +

                          Backup

                          +

                          We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                          +
                          +
                          +

                          Kill all containers

                          +

                          At this point you have two monitoring stacks installed with the older version running.

                          +

                          If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                          +

                          kill the older 3.x version containers by running:

                          +
                          ./kill-all.sh
                          +
                          +
                          +

                          Start version 4.y in normal mode

                          +

                          From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                          +
                          ./start-all.sh -d /path/to/copy/data/dir
                          +
                          +
                          +

                          Point your browser to http://{ip}:3000 and see that the data is there.

                          +
                          +
                          +
                          +

                          Rollback to version 3.x

                          +

                          To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                          +

                          To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                          +
                          ./kill-all.sh
                          +cd /path/to/scylla-grafana-3.x/
                          +./start-all.sh -d /path/to/original/data/dir
                          +
                          +
                          +
                          +
                          +
                          +

                          Post-installation: Metrics back-filling

                          +

                          Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                          +

                          For example, this is a recording rule that calculates the p99 write latency:

                          +
                          - record: wlatencyp99
                          +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                          +  labels:
                          +    by: "instance,shard"
                          +
                          +
                          +

                          For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                          +

                          Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                          +
                          +
                          +

                          Note

                          +

                          If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                          +
                          +
                          +
                          +../_images/before-backfilling.png +
                          +

                          This is an example of missing latency graph

                          +
                          +
                          +

                          The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                          +

                          For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                          +

                          In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                          +

                          The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                          +
                          +

                          Determine the backfilling period

                          +

                          When you run the backfilling process you need to determine the start time and end time.

                          +
                          +

                          Determine the start time

                          +

                          The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                          +

                          If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                          +

                          For the rest of this example, we will assume that your retention time is 360 days.

                          +
                          +
                          +

                          Determine the end time

                          +

                          Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                          +

                          If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                          +

                          That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                          +

                          The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                          +
                          +
                          +
                          +

                          Backfilling Process

                          +
                          +

                          backup

                          +

                          If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                          +

                          To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                          +
                          +
                          +

                          Restart the monitoring stack

                          +

                          You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                          +

                          -b "--storage.tsdb.allow-overlapping-blocks"

                          +
                          +
                          +

                          Create the data files

                          +

                          We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                          +

                          The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                          +

                          Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                          +
                          docker exec -it aprom sh
                          +cd /prometheus/data/
                          +promtool tsdb create-blocks-from rules \
                          +--start $start \
                          +--end $end \
                          +--url http://localhost:9090 \
                          +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                          +
                          +
                          +

                          It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                          +
                          +
                          +

                          Note

                          +

                          Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                          +
                          +
                          +
                          +
                          +

                          Copy the data files

                          +

                          Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                          +

                          Copy the data files to the Prometheus directory:

                          +
                          cp data/* .
                          +
                          +
                          +

                          The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                          +

                          Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                          +
                          +../_images/after-backfilling.jpg +
                          +

                          Un example: after loading half of the data

                          +
                          +
                          +
                          +
                          +
                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.3/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..5aec764a2 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries use ALLOW FILTERING

                          +

                          Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                          +

                          These kinds of queries can create a bigger load on Scylla, and should be used with care.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlCLAll.html b/branch-4.3/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..e3e402655 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries use Consistency Level: ALL

                          +

                          Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                          +

                          Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                          +

                          Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlCLAny.html b/branch-4.3/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..11fe04e43 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries use Consistency Level: ANY

                          +

                          Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                          +

                          Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.3/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..bf9d705e3 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries are not token-aware

                          +

                          Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                          +

                          Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlNonPaged.html b/branch-4.3/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..687832662 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some SELECT queries are non-paged

                          +

                          By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                          +
                          +

                          Blog-post Links

                          +

                          https://www.scylladb.com/2018/07/13/efficient-query-paging/

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.3/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..f254c7052 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries are non-prepared

                          +

                          Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlReverseOrder.html b/branch-4.3/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..ae3461962 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries use reverse order

                          +

                          Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                          +

                          Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/heavyCompaction.html b/branch-4.3/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..3e0d724ee --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Compaction takes lots of memory and CPU

                          +

                          ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                          +

                          If this is the case, you can do one of the following:

                          +
                            +
                          • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                            +
                            +
                              +
                            • In the scylla.yml configuration file: compaction_static_shares: 100

                            • +
                            • In the command line when starting ScyllaDB: --compaction-static-shares 100

                            • +
                            +
                            +

                            You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                            +
                          • +
                          • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                          • +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/index.html b/branch-4.3/use-monitoring/advisor/index.html new file mode 100644 index 000000000..c9f3527e8 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/index.html @@ -0,0 +1,722 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Stack Advisor

                          +
                          +
                          +

                          The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                          +
                          +

                          The Advisor section

                          +
                          +../../_images/advisor_panel.png +
                          +

                          The Advisor section

                          +
                          +
                          +

                          The Advisor section is located on the Overview dashboard and consists of two parts:

                          +

                          On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                          +

                          For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                          +

                          On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                          +

                          For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                          +

                          Each Advisor issue is explained in detail:

                          + +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/nodeCLErrors.html b/branch-4.3/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..8686ac9c8 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Some operation failed due to unsatisfied consistency level

                          +

                          ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                          +

                          For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                          +

                          When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/nodeIOErrors.html b/branch-4.3/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..6baaf56f8 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          I/O Errors can indicate a node with a faulty disk

                          +

                          I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.3/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..90a0660de --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Some operations failed on the replica side

                          +

                          ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                          +

                          An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.3/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..b5a27388b --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          CQL queries are not balanced among shards

                          +

                          For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                          +

                          There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                          +
                          +

                          Blog post link

                          +

                          https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.3/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..2c8919afe --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,693 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Prepared statements cache eviction

                          +

                          Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                          +
                            +
                          • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                          • +
                          • The prepared statements cache might be too small for the number of prepared statements.

                          • +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/systemOverload.html b/branch-4.3/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..832bf7584 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          System Overload

                          +

                          There could be multiple indications that a system is overloaded:

                          +
                            +
                          • Timeouts

                          • +
                          • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                          • +
                          • CPU at 100% when no background process (like compaction or repair) runs.

                          • +
                          • Ques are getting filled.

                          • +
                          +

                          If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/cql_optimization.html b/branch-4.3/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..3546473a3 --- /dev/null +++ b/branch-4.3/use-monitoring/cql_optimization.html @@ -0,0 +1,809 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          The CQL Optimization

                          +

                          The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                          +
                          +../_images/cql_optimization_master.png +
                          +

                          The CQL Dashboard

                          +
                          +
                          +

                          The upper part of the dashboard holds CQL related metrics.

                          +

                          The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                          +
                          +

                          Note

                          +

                          Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                          +
                          +

                          The following sections describe each of the dashboard’s panel

                          +
                          +

                          Prepared Statements

                          +

                          Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                          +

                          Using prepared statements has the following benefits:

                          +
                            +
                          • The database only needs to parse the query once

                          • +
                          • The driver can route the query to the right node

                          • +
                          • Using place-holders and values is safer and prevents CQL-Injection

                          • +
                          +

                          The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                          +

                          The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                          +
                          +
                          +

                          Token Aware

                          +

                          Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                          +

                          Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                          +

                          The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                          +

                          The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                          +
                          +
                          +

                          Paged Queries

                          +

                          By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                          +

                          The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                          +

                          The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                          +
                          +
                          +

                          Reversed CQL Reads

                          +

                          Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                          +

                          Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                          +

                          For example, look at the following table:

                          +
                          CREATE TABLE ks1.table_demo (
                          +   category text,
                          +   type int,
                          +   PRIMARY KEY (category, type))
                          +WITH CLUSTERING ORDER BY (type DESC);
                          +
                          +
                          +

                          The following query uses reverse order:

                          +
                          select * from ks1.table_demo where category='cat1' order by type ASC;
                          +
                          +
                          +

                          The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                          +

                          The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                          +
                          +
                          +

                          ALLOW FILTERING

                          +

                          Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                          +

                          These kinds of queries can create a big load on the system, and should be used with care.

                          +

                          The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                          +

                          The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                          +

                          The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                          +

                          The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                          +

                          The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                          +
                          +
                          +

                          Consistency Level

                          +

                          Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                          +

                          The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                          +

                          Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                          +

                          The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                          +

                          The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                          +

                          The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                          +

                          The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                          +
                          +
                          +

                          Cross DC

                          +

                          Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                          +
                          +
                          +

                          Cross DC Consistency Level

                          +

                          Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                          +
                          +
                          +

                          Cross DC read requests

                          +
                          +

                          Note

                          +

                          The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                          +
                          +

                          In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                          +

                          The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/index.html b/branch-4.3/use-monitoring/index.html new file mode 100644 index 000000000..f5e008644 --- /dev/null +++ b/branch-4.3/use-monitoring/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Using Scylla Monitoring Stack

                          +
                          +
                          +

                          There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.4/.buildinfo b/branch-4.4/.buildinfo new file mode 100644 index 000000000..2d1c267d8 --- /dev/null +++ b/branch-4.4/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: d4887506b664dc9973e5f1a61a1bae22 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.4/.doctrees/common/monitor-description.doctree b/branch-4.4/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..89cd73e79 Binary files /dev/null and b/branch-4.4/.doctrees/common/monitor-description.doctree differ diff --git a/branch-4.4/.doctrees/environment.pickle b/branch-4.4/.doctrees/environment.pickle new file mode 100644 index 000000000..d97f15212 Binary files /dev/null and b/branch-4.4/.doctrees/environment.pickle differ diff --git a/branch-4.4/.doctrees/index.doctree b/branch-4.4/.doctrees/index.doctree new file mode 100644 index 000000000..31c2b1c2c Binary files /dev/null and b/branch-4.4/.doctrees/index.doctree differ diff --git a/branch-4.4/.doctrees/install/docker-compose.doctree b/branch-4.4/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..22ccc19fd Binary files /dev/null and b/branch-4.4/.doctrees/install/docker-compose.doctree differ diff --git a/branch-4.4/.doctrees/install/index.doctree b/branch-4.4/.doctrees/install/index.doctree new file mode 100644 index 000000000..17aa6bebb Binary files /dev/null and b/branch-4.4/.doctrees/install/index.doctree differ diff --git a/branch-4.4/.doctrees/install/min-prod-hw.doctree b/branch-4.4/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..a35a603fd Binary files /dev/null and b/branch-4.4/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.4/.doctrees/install/monitor-without-docker.doctree b/branch-4.4/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..db4015b20 Binary files /dev/null and b/branch-4.4/.doctrees/install/monitor-without-docker.doctree differ diff --git a/branch-4.4/.doctrees/install/monitoring-stack.doctree b/branch-4.4/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..07fee2b73 Binary files /dev/null and b/branch-4.4/.doctrees/install/monitoring-stack.doctree differ diff --git a/branch-4.4/.doctrees/install/start-all.doctree b/branch-4.4/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..de637bb99 Binary files /dev/null and b/branch-4.4/.doctrees/install/start-all.doctree differ diff --git a/branch-4.4/.doctrees/install/thanos.doctree b/branch-4.4/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..d062872b3 Binary files /dev/null and b/branch-4.4/.doctrees/install/thanos.doctree differ diff --git a/branch-4.4/.doctrees/intro.doctree b/branch-4.4/.doctrees/intro.doctree new file mode 100644 index 000000000..665bb4084 Binary files /dev/null and b/branch-4.4/.doctrees/intro.doctree differ diff --git a/branch-4.4/.doctrees/procedures/alerts/alerting.doctree b/branch-4.4/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..6cd809b3e Binary files /dev/null and b/branch-4.4/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.4/.doctrees/procedures/alerts/index.doctree b/branch-4.4/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..11d606a19 Binary files /dev/null and b/branch-4.4/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.4/.doctrees/procedures/datadog/index.doctree b/branch-4.4/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..a35144241 Binary files /dev/null and b/branch-4.4/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.4/.doctrees/procedures/index.doctree b/branch-4.4/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..5a5f14176 Binary files /dev/null and b/branch-4.4/.doctrees/procedures/index.doctree differ diff --git a/branch-4.4/.doctrees/procedures/updating-dashboard.doctree b/branch-4.4/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..6e8035729 Binary files /dev/null and b/branch-4.4/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/branch-4.4/.doctrees/reference/index.doctree b/branch-4.4/.doctrees/reference/index.doctree new file mode 100644 index 000000000..2afc2f80d Binary files /dev/null and b/branch-4.4/.doctrees/reference/index.doctree differ diff --git a/branch-4.4/.doctrees/reference/matrix.doctree b/branch-4.4/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..e15255530 Binary files /dev/null and b/branch-4.4/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.4/.doctrees/reference/monitoring-apis.doctree b/branch-4.4/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..64e99ac45 Binary files /dev/null and b/branch-4.4/.doctrees/reference/monitoring-apis.doctree differ diff --git a/branch-4.4/.doctrees/troubleshooting/index.doctree b/branch-4.4/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..16c0b0946 Binary files /dev/null and b/branch-4.4/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.4/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/branch-4.4/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..d9a24ea0b Binary files /dev/null and b/branch-4.4/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/index.doctree b/branch-4.4/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..c67fe88d1 Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..ae113f14c Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..d193a40dc Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..c0a070c28 Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..61bdb0414 Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..b56cea704 Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..5e3e33eab Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..a2a696ba2 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..6d86a826a Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..15694f046 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..7ed43ff9a Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..27c817ccf Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..a070b99d8 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..08f763d04 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..71e67709e Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..a19ad32f4 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..d958e8c58 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..55121b7ca Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..0417dae7d Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..c1c488bc1 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..281b5d676 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..5f5291265 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/cql-optimization.doctree b/branch-4.4/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..7fb1755fa Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/index.doctree b/branch-4.4/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..b3c347dcd Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.4/.nojekyll b/branch-4.4/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.4/404.html b/branch-4.4/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.4/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                          +

                          404

                          +

                          The ScyllaDB monster ate your page!

                          +

                          + Home +

                          +
                          + + + \ No newline at end of file diff --git a/branch-4.4/CNAME b/branch-4.4/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.4/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.4/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.4/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..3e85b60ab --- /dev/null +++ b/branch-4.4/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,576 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" diff --git a/branch-4.4/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.4/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.4/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.4/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.4/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/branch-4.4/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.4/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.4/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/branch-4.4/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.4/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/branch-4.4/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/branch-4.4/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/branch-4.4/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.4/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/branch-4.4/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.4/_images/1.png b/branch-4.4/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.4/_images/1.png differ diff --git a/branch-4.4/_images/2.png b/branch-4.4/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.4/_images/2.png differ diff --git a/branch-4.4/_images/3.png b/branch-4.4/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.4/_images/3.png differ diff --git a/branch-4.4/_images/advisor_panel.png b/branch-4.4/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-4.4/_images/advisor_panel.png differ diff --git a/branch-4.4/_images/after-backfilling.jpg b/branch-4.4/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.4/_images/after-backfilling.jpg differ diff --git a/branch-4.4/_images/alertmanager.png b/branch-4.4/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.4/_images/alertmanager.png differ diff --git a/branch-4.4/_images/before-backfilling.png b/branch-4.4/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.4/_images/before-backfilling.png differ diff --git a/branch-4.4/_images/cql_optimization_master.png b/branch-4.4/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.4/_images/cql_optimization_master.png differ diff --git a/branch-4.4/_images/datadog.png b/branch-4.4/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.4/_images/datadog.png differ diff --git a/branch-4.4/_images/grafana.png b/branch-4.4/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.4/_images/grafana.png differ diff --git a/branch-4.4/_images/monitor.png b/branch-4.4/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-4.4/_images/monitor.png differ diff --git a/branch-4.4/_images/monitoring_stack.png b/branch-4.4/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.4/_images/monitoring_stack.png differ diff --git a/branch-4.4/_images/monitoring_stack1.png b/branch-4.4/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.4/_images/monitoring_stack1.png differ diff --git a/branch-4.4/_sources/common/monitor-description.rst.txt b/branch-4.4/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.4/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.4/_sources/index.rst.txt b/branch-4.4/_sources/index.rst.txt new file mode 100644 index 000000000..1d8a0d691 --- /dev/null +++ b/branch-4.4/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on Scylla University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.4/_sources/install/docker-compose.rst.txt b/branch-4.4/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.4/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.4/_sources/install/index.rst.txt b/branch-4.4/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/branch-4.4/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.4/_sources/install/min-prod-hw.rst.txt b/branch-4.4/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/branch-4.4/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                          + + + + + + + + + + + +
                          # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                          00
                          + +
                          + \ No newline at end of file diff --git a/branch-4.4/_sources/install/monitor-without-docker.rst.txt b/branch-4.4/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..d0be59164 --- /dev/null +++ b/branch-4.4/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                          `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.4/_sources/install/monitoring-stack.rst.txt b/branch-4.4/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..911295768 --- /dev/null +++ b/branch-4.4/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,409 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                          `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.5 + - 2.45.0 + - 10.0.2 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.4/_sources/install/start-all.rst.txt b/branch-4.4/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..4407b5495 --- /dev/null +++ b/branch-4.4/_sources/install/start-all.rst.txt @@ -0,0 +1,105 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.4/_sources/install/thanos.rst.txt b/branch-4.4/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.4/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.4/_sources/intro.rst.txt b/branch-4.4/_sources/intro.rst.txt new file mode 100644 index 000000000..ed1a30320 --- /dev/null +++ b/branch-4.4/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.4/_sources/procedures/alerts/alerting.rst.txt b/branch-4.4/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.4/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.4/_sources/procedures/alerts/index.rst.txt b/branch-4.4/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.4/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.4/_sources/procedures/datadog/index.rst.txt b/branch-4.4/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bcc4e9b7 --- /dev/null +++ b/branch-4.4/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,68 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Non Scylla Cloud users, download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Cloud users, skip this step, it's been take care for by the cloud. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.4/_sources/procedures/index.rst.txt b/branch-4.4/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..76a24002a --- /dev/null +++ b/branch-4.4/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.4/_sources/procedures/updating-dashboard.rst.txt b/branch-4.4/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.4/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.4/_sources/reference/index.rst.txt b/branch-4.4/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/branch-4.4/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.4/_sources/reference/matrix.rst.txt b/branch-4.4/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..23cb1efa2 --- /dev/null +++ b/branch-4.4/_sources/reference/matrix.rst.txt @@ -0,0 +1,155 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.4/_sources/reference/monitoring-apis.rst.txt b/branch-4.4/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/branch-4.4/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.4/_sources/troubleshooting/index.rst.txt b/branch-4.4/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..464ef0020 --- /dev/null +++ b/branch-4.4/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-4.4/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/branch-4.4/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/branch-4.4/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.4/_sources/upgrade/index.rst.txt b/branch-4.4/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/branch-4.4/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                          +
                          +
                          +
                          Upgrade Scylla Open Source
                          +
                          +
                          + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                          +
                          +
                          diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..71dbb9dbc --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,138 @@ +================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y +================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x to 4.y, for example, between 4.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x version that is currently running. + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x after you completed the moving to version 4.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-4.4/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.4/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.4/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.4/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.4/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.4/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.4/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.4/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.4/_sources/use-monitoring/cql-optimization.rst.txt b/branch-4.4/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.4/_sources/use-monitoring/index.rst.txt b/branch-4.4/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.4/_static/basic.css b/branch-4.4/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.4/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.4/_static/check-solid.svg b/branch-4.4/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.4/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.4/_static/clipboard.min.js b/branch-4.4/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.4/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.4/_static/copybutton.css b/branch-4.4/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.4/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                          Short

                          + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.4/_static/copybutton.js b/branch-4.4/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.4/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.4/_static/copybutton_funcs.js b/branch-4.4/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.4/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.4/_static/css/main.css b/branch-4.4/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-4.4/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.4/_static/doctools.js b/branch-4.4/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.4/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.4/_static/documentation_options.js b/branch-4.4/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.4/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.4/_static/file.png b/branch-4.4/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.4/_static/file.png differ diff --git a/branch-4.4/_static/img/banner-background.svg b/branch-4.4/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.4/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.4/_static/img/favicon-228x228.png b/branch-4.4/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.4/_static/img/favicon-228x228.png differ diff --git a/branch-4.4/_static/img/favicon-32x32.png b/branch-4.4/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.4/_static/img/favicon-32x32.png differ diff --git a/branch-4.4/_static/img/favicon.ico b/branch-4.4/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.4/_static/img/favicon.ico differ diff --git a/branch-4.4/_static/img/icons/icon-about-team.svg b/branch-4.4/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.4/_static/img/icons/icon-about-us-m.svg b/branch-4.4/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-about-us.svg b/branch-4.4/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-alternator.svg b/branch-4.4/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-apps.svg b/branch-4.4/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-architecture.svg b/branch-4.4/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.4/_static/img/icons/icon-benchmarks.svg b/branch-4.4/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.4/_static/img/icons/icon-blog.svg b/branch-4.4/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.4/_static/img/icons/icon-careers.svg b/branch-4.4/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.4/_static/img/icons/icon-chevron-left.svg b/branch-4.4/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.4/_static/img/icons/icon-chevron-right.svg b/branch-4.4/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.4/_static/img/icons/icon-circe.svg b/branch-4.4/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-clock.svg b/branch-4.4/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-close.svg b/branch-4.4/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-cloud-docs.svg b/branch-4.4/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-cloud.svg b/branch-4.4/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-comparison.svg b/branch-4.4/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.4/_static/img/icons/icon-contact-us.svg b/branch-4.4/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.4/_static/img/icons/icon-developers-blog.svg b/branch-4.4/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.4/_static/img/icons/icon-docs.svg b/branch-4.4/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.4/_static/img/icons/icon-enterprise-m.svg b/branch-4.4/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-enterprise.svg b/branch-4.4/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-events.svg b/branch-4.4/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.4/_static/img/icons/icon-exclamation.svg b/branch-4.4/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-expand.svg b/branch-4.4/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-forum.svg b/branch-4.4/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-getting-started.svg b/branch-4.4/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-glossary.svg b/branch-4.4/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-home.svg b/branch-4.4/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-infoworld.svg b/branch-4.4/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.4/_static/img/icons/icon-integrations.svg b/branch-4.4/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-knowledge-base.svg b/branch-4.4/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-less.svg b/branch-4.4/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-live-test.svg b/branch-4.4/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.4/_static/img/icons/icon-mail-list.svg b/branch-4.4/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-manager.svg b/branch-4.4/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.4/_static/img/icons/icon-memory-management.svg b/branch-4.4/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.4/_static/img/icons/icon-modeling.svg b/branch-4.4/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-monitoring.svg b/branch-4.4/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.4/_static/img/icons/icon-networking.svg b/branch-4.4/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.4/_static/img/icons/icon-news.svg b/branch-4.4/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.4/_static/img/icons/icon-newsletter.svg b/branch-4.4/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.4/_static/img/icons/icon-nsql-guides.svg b/branch-4.4/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.4/_static/img/icons/icon-open-source.svg b/branch-4.4/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.4/_static/img/icons/icon-operator.svg b/branch-4.4/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-overview.svg b/branch-4.4/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.4/_static/img/icons/icon-partners.svg b/branch-4.4/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.4/_static/img/icons/icon-plus.svg b/branch-4.4/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-pricing.svg b/branch-4.4/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.4/_static/img/icons/icon-release-notes.svg b/branch-4.4/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.4/_static/img/icons/icon-resource-center.svg b/branch-4.4/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.4/_static/img/icons/icon-roadmap.svg b/branch-4.4/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.4/_static/img/icons/icon-search.svg b/branch-4.4/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.4/_static/img/icons/icon-slack.svg b/branch-4.4/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-stack-overflow.svg b/branch-4.4/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.4/_static/img/icons/icon-summit.svg b/branch-4.4/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-support.svg b/branch-4.4/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.4/_static/img/icons/icon-tech-talks.svg b/branch-4.4/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.4/_static/img/icons/icon-testing.svg b/branch-4.4/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.4/_static/img/icons/icon-thumbs-down.svg b/branch-4.4/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-thumbs-up.svg b/branch-4.4/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-tip.svg b/branch-4.4/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.4/_static/img/icons/icon-training.svg b/branch-4.4/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.4/_static/img/icons/icon-triangle-down.svg b/branch-4.4/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.4/_static/img/icons/icon-university.svg b/branch-4.4/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.4/_static/img/icons/icon-users-blog.svg b/branch-4.4/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.4/_static/img/icons/icon-warning.svg b/branch-4.4/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-webinars.svg b/branch-4.4/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.4/_static/img/icons/icon-whitepapers.svg b/branch-4.4/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.4/_static/img/icons/icon-workshop.svg b/branch-4.4/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/logo-docs.svg b/branch-4.4/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.4/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.4/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.4/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.4/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.4/_static/img/mascots/404.jpg b/branch-4.4/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.4/_static/img/mascots/404.jpg differ diff --git a/branch-4.4/_static/img/mascots/scylla-3monsters.png b/branch-4.4/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.4/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-alternator.svg b/branch-4.4/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.4/_static/img/mascots/scylla-cloud.svg b/branch-4.4/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.4/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.4/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-computer-headset.png b/branch-4.4/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-cup-number-one.png b/branch-4.4/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-docs.svg b/branch-4.4/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.4/_static/img/mascots/scylla-drivers.svg b/branch-4.4/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.4/_static/img/mascots/scylla-enterprise.svg b/branch-4.4/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.4/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.4/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-forklift-migration.png b/branch-4.4/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-gear.png b/branch-4.4/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-hardhat.png b/branch-4.4/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-headband.png b/branch-4.4/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-headset.png b/branch-4.4/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-hearts.png b/branch-4.4/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-looking-down.png b/branch-4.4/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-looking-up.png b/branch-4.4/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.4/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.4/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-manager.svg b/branch-4.4/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.4/_static/img/mascots/scylla-monitor.svg b/branch-4.4/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.4/_static/img/mascots/scylla-movement-fast.png b/branch-4.4/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-movement.png b/branch-4.4/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-onpremise.png b/branch-4.4/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-opensource.svg b/branch-4.4/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.4/_static/img/mascots/scylla-operator.svg b/branch-4.4/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.4/_static/img/mascots/scylla-plugin.png b/branch-4.4/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-release-mascot.png b/branch-4.4/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-repair.png b/branch-4.4/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-server.png b/branch-4.4/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-sleeping.png b/branch-4.4/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-tall-measure.png b/branch-4.4/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-university.png b/branch-4.4/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-weights.png b/branch-4.4/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-window-cleaning.png b/branch-4.4/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-with-computer-2.png b/branch-4.4/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-with-computer.png b/branch-4.4/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-with-linux.png b/branch-4.4/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-writting.png b/branch-4.4/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.4/_static/img/menu.svg b/branch-4.4/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.4/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.4/_static/img/scylla-monitor.png b/branch-4.4/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.4/_static/img/scylla-monitor.png differ diff --git a/branch-4.4/_static/js/main.bundle.js b/branch-4.4/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-4.4/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
                        • Back
                        • ',backButtonPosition:"top",wrapper:"
                          ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                            "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                            ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                            ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                            ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                            ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                            "],col:[2,"","
                            "],tr:[2,"","
                            "],td:[3,"","
                            "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +

                            ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                            + + +
                            + + + + + +
                            + + +
                            + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/genindex.html b/branch-4.4/genindex.html new file mode 100644 index 000000000..5dc42b806 --- /dev/null +++ b/branch-4.4/genindex.html @@ -0,0 +1,659 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + + + +
                            + + + + + +
                            + + +
                            + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/index.html b/branch-4.4/index.html new file mode 100644 index 000000000..131569520 --- /dev/null +++ b/branch-4.4/index.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            ScyllaDB Monitoring Stack

                            +
                            +
                            +

                            ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                            +_images/monitor.png +

                            The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                            +
                              +
                            • prometheus - collects and stores metrics

                            • +
                            • alertmanager - handles alerts

                            • +
                            • grafana - dashboard server

                            • +
                            +

                            Choose a topic to get started:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/docker-compose.html b/branch-4.4/install/docker-compose.html new file mode 100644 index 000000000..bef92e8bf --- /dev/null +++ b/branch-4.4/install/docker-compose.html @@ -0,0 +1,829 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Using Docker Compose

                            +

                            Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                            +

                            Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                            +
                            +

                            Warning

                            +

                            docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                            +
                            +
                            +

                            Prerequisite

                            +

                            Make sure you have docker and docker-compose installed.

                            +
                            +
                            +

                            Setting Prometheus

                            +

                            The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                            +

                            You can use ./prometheus-config.sh to generate the file, for example:

                            +
                            ./prometheus-config.sh --compose
                            +
                            +
                            +

                            For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                            +
                            +
                            +

                            Setting Grafana Provisioning

                            +

                            Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                            +
                            +

                            Grafana Data-Source file

                            +

                            Run the following command to update the datasource:

                            +
                            ./grafana-datasource.sh --compose
                            +
                            +
                            +

                            You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                            +
                            +
                            +

                            Grafana Dashboard Load file

                            +

                            To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                            +
                            ./generate-dashboards.sh -t -v 2020.1
                            +
                            +
                            +

                            This command generates the files under: grafana/provisioning/dashboards/

                            +
                            +
                            +
                            +

                            Docker Compose file

                            +

                            You can use the following example as a base for your docker compose.

                            +

                            Pass the following to a file called docker-compose.yml

                            +
                            services:
                            +  alertmanager:
                            +    container_name: aalert
                            +    image: prom/alertmanager:v0.24.0
                            +    ports:
                            +    - 9093:9093
                            +    volumes:
                            +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                            +  grafana:
                            +    container_name: agraf
                            +    environment:
                            +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                            +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                            +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                            +    # This is where you set Grafana security
                            +    - GF_AUTH_BASIC_ENABLED=false
                            +    - GF_AUTH_ANONYMOUS_ENABLED=true
                            +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                            +    - GF_SECURITY_ADMIN_PASSWORD=admin
                            +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                            +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                            +    image: grafana/grafana:9.3.11
                            +    ports:
                            +    - 3000:3000
                            +    user: 1000:1000
                            +    volumes:
                            +    - ./grafana/build:/var/lib/grafana/dashboards
                            +    - ./grafana/plugins:/var/lib/grafana/plugins
                            +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                            +    # Uncomment the following line for grafana persistency
                            +    # - path/to/grafana/dir:/var/lib/grafana
                            +  loki:
                            +    command:
                            +    - --config.file=/mnt/config/loki-config.yaml
                            +    container_name: loki
                            +    image: grafana/loki:2.7.3
                            +    ports:
                            +    - 3100:3100
                            +    volumes:
                            +    - ./loki/rules:/etc/loki/rules
                            +    - ./loki/conf:/mnt/config
                            +  promotheus:
                            +    command:
                            +    - --config.file=/etc/prometheus/prometheus.yml
                            +    container_name: aprom
                            +    image: prom/prometheus:v2.42.0
                            +    ports:
                            +    - 9090:9090
                            +    volumes:
                            +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                            +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                            +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                            +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                            +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                            +    # Uncomment the following line for prometheus persistency 
                            +    # - path/to/data/dir:/prometheus/data
                            +  promtail:
                            +    command:
                            +    - --config.file=/etc/promtail/config.yml
                            +    container_name: promtail
                            +    image: grafana/promtail:2.7.3
                            +    ports:
                            +    - 1514:1514
                            +    - 9080:9080
                            +    volumes:
                            +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                            +version: '3'
                            +
                            +
                            +
                            +

                            Start and Stop

                            +

                            To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/index.html b/branch-4.4/install/index.html new file mode 100644 index 000000000..37a21b62d --- /dev/null +++ b/branch-4.4/install/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Download and Install Scylla Monitoring Stack

                            +
                            +
                            +

                            Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                            +

                            Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/min-prod-hw.html b/branch-4.4/install/min-prod-hw.html new file mode 100644 index 000000000..5f3939b49 --- /dev/null +++ b/branch-4.4/install/min-prod-hw.html @@ -0,0 +1,756 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Minimal Production System Recommendations

                            +
                              +
                            • CPU - at least 2 physical cores/ 4vCPUs

                            • +
                            • Memory - 15GB+ DRAM and proportional to the number of cores.

                            • +
                            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                            • +
                            • Network - 1GbE/10GbE preferred

                            • +
                            +
                            +

                            Calculating Prometheus Minimal Disk Space requirement

                            +

                            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                            +

                            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                            +

                            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                            +
                            6 * 16 * 15 * 12MB ~ 16GB
                            +
                            +
                            +

                            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                            +
                            +
                            +

                            Calculating Prometheus Minimal Memory Space requirement

                            +

                            Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                            +

                            For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                            + +
                            + +++++++ + + + +
                            # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                            00
                            + +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/monitor-without-docker.html b/branch-4.4/install/monitor-without-docker.html new file mode 100644 index 000000000..163880aaa --- /dev/null +++ b/branch-4.4/install/monitor-without-docker.html @@ -0,0 +1,1172 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Deploying Scylla Monitoring Stack Without Docker

                            +
                            +

                            Introduction

                            +

                            The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                            +

                            Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                            +

                            Scylla Monitoring uses the following components:

                            +
                              +
                            • Alertmanager

                            • +
                            • Grafana Loki

                            • +
                            • Prometheus

                            • +
                            • Grafana

                            • +
                            +

                            The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                            +

                            We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                            +
                            +
                            +

                            Minimal Production System Recommendations

                            +
                              +
                            • CPU - at least 2 physical cores/ 4vCPUs

                            • +
                            • Memory - 15GB+ DRAM and proportional to the number of cores.

                            • +
                            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                            • +
                            • Network - 1GbE/10GbE preferred

                            • +
                            +
                            +

                            Calculating Prometheus Minimal Disk Space requirement

                            +

                            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                            +

                            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                            +

                            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                            +
                            6 * 16 * 15 * 12MB ~ 16GB
                            +
                            +
                            +

                            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                            +
                            +
                            +

                            Calculating Prometheus Minimal Memory Space requirement

                            +

                            Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                            +

                            For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                            + +
                            + +++++++ + + + +
                            # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                            00
                            + +
                            +

                            The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                            +
                            +

                            Note

                            +

                            Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                            +
                            +
                            +
                            +
                            +

                            Install Scylla Monitoring Stack

                            +

                            The following procedure uses a CentOS 7 based instance

                            +
                              +
                            1. Download the latest Scylla Monitoring Stack release.

                            2. +
                            +
                            wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.4.5.tar.gz
                            +
                            +
                            +
                              +
                            1. Open the tar

                            2. +
                            +

                            tar -xvf scylla-monitoring-*.tar.gz

                            +
                            +
                            +

                            Install Alertmanager

                            +

                            Tested with alertmanager 0.22.2 version

                            +
                              +
                            1. Install alertmanager

                            2. +
                            +
                            wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                            +tar -xvf alertmanager-*.linux-amd64.tar.gz
                            +
                            +
                            +
                              +
                            1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                            2. +
                            +

                            For example:

                            +
                            cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.4.5/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                            +
                            +
                            +
                              +
                            1. Start the Alertmanager

                            2. +
                            +

                            For example:

                            +
                            cd alertmanager-0.22.2.linux-amd64
                            +./alertmanager
                            +
                            +
                            +
                              +
                            1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                            2. +
                            +

                            For example:

                            +
                            http://192.168.135.166:9093/
                            +
                            +
                            +../_images/alertmanager.png +
                            +
                            +

                            Install Grafana Loki

                            +

                            Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                            +

                            We recomand using Loki with containers, but you can install it locally as described in Loki installation

                            +

                            You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                            +

                            Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                            +

                            Loki Related files

                            +

                            Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                            +
                            mkdir -p /etc/loki/rules
                            +mkdir -p /etc/loki/config
                            +cp loki/rules/* /etc/loki/rules
                            +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                            +
                            +
                            +

                            Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                            +

                            Promtail Related files

                            +

                            Promtail has a configuration file. You need to copy and modify the configuration.

                            +
                            mkdir -p /etc/promtail/
                            +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                            +
                            +
                            +

                            Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                            +
                            +
                            +

                            Install Prometheus

                            +

                            Tested with Prometheus version 2.27.1

                            +
                            +

                            Note

                            +

                            If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                            +
                            +
                              +
                            1. Install Prometheus

                            2. +
                            +
                            wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                            +tar -xvf prometheus-*.linux-amd64.tar.gz
                            +
                            +
                            +

                            2. Create Data and Config directories +.. code-block:: shell

                            +
                            +

                            mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                            +
                            +
                              +
                            1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                            2. +
                            +

                            Copy prometheus/prometheus.yml.template to prometheus.yml

                            +

                            For example:

                            +
                            cp scylla-monitoring-scylla-monitoring-4.4.5/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                            +cp scylla-monitoring-scylla-monitoring-4.4.5/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                            +
                            +
                            +
                              +
                            1. Edit the prometheus.yml file to point to the correct static data sources.

                            2. +
                            +
                            +

                            Note

                            +

                            Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                            +
                            +
                            vi /etc/prometheus/prometheus.yml
                            +
                            +
                            +

                            Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                            +

                            For example if the alertmanager will run on the same host:

                            +
                            alerting:
                            +   alertmanagers:
                            +   - static_configs:
                            +       - targets:
                            +           - 127.0.0.1:9093
                            +
                            +
                            +

                            Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                            +

                            For example the scrape config for Scylla:

                            +
                            global:
                            +  scrape_interval: 5s # By default, scrape targets every 5 second.
                            +  scrape_timeout: 4s # Timeout before trying to scape a target again
                            +
                            +  # Attach these labels to any time series or alerts when communicating with
                            +  # external systems (federation, remote storage, Alertmanager).
                            +  external_labels:
                            +    monitor: 'scylla-monitor'
                            +
                            +scrape_configs:
                            +- job_name: scylla
                            +  honor_labels: false
                            +  file_sd_configs:
                            +    - files:
                            +      - /etc/scylla.d/prometheus/scylla_servers.yml
                            +  relabel_configs:
                            +    - source_labels: [__address__]
                            +      regex:  '([^:]+)'
                            +      target_label: __address__
                            +      replacement: '${1}:9180'
                            +
                            +    - source_labels: [__address__]
                            +      regex:  '(.*):.+'
                            +      target_label: instance
                            +      replacement: '${1}'
                            +
                            +
                            +
                              +
                            1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                            2. +
                            +
                            +

                            Note

                            +

                            There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                            +
                            +

                            An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                            +
                            +

                            Note

                            +

                            You must have both files even if you are not using Scylla Manager

                            +
                            +

                            Add the labels for the cluster and data-center

                            +

                            scylla_servers.yml:

                            +

                            For example:

                            +
                            cat scylla_servers.yml
                            +# List Scylla end points
                            +
                            +- targets:
                            +  - 192.168.66.6
                            +  - 192.168.66.244
                            +  labels:
                            +    cluster: cluster1
                            +    dc: dc1
                            +- targets:
                            +    - 172.17.0.3
                            +  labels:
                            +    cluster: cluster1
                            +    dc: dc2
                            +
                            +
                            +
                            +

                            Note

                            +

                            See the previous note about deprecating the node_exporter_servers.yml file.

                            +
                            +

                            scylla_manager_server.yml

                            +

                            For example:

                            +
                            - targets:
                            +  - 127.0.0.1:5090
                            +
                            +
                            +
                              +
                            1. Start Prometheus server:

                            2. +
                            +

                            For example:

                            +
                            cd scylla-monitoring-scylla-monitoring-4.4.5/
                            +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                            +
                            +
                            +

                            Data should start accumulate on: /prometheus/data

                            +
                              +
                            1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                            2. +
                            +

                            For example:

                            +
                            http://192.168.135.166:9090/
                            +
                            +
                            +../_images/1.png +

                            Prometheus console should be visible

                            +
                              +
                            1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                            2. +
                            +

                            For example:

                            +

                            node_memory_MemFree

                            +../_images/2.png +

                            And

                            +

                            scylla_reactor_utilization

                            +../_images/3.png +

                            At this point Scylla is emitting the metrics and Prometheus is able to store them.

                            +
                            +
                            +

                            Install Grafana

                            +

                            Tested with Grafna 7.5.7

                            +
                              +
                            1. Install Grafana based on the instructions here

                            2. +
                            +

                            Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                            +
                              +
                            1. Access Scylla-Grafana-monitoring directory

                            2. +
                            +
                            cd scylla-monitoring-scylla-monitoring-4.4.5/
                            +
                            +
                            +
                              +
                            1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                            2. +
                            +
                            sudo cp -r grafana/plugins /var/lib/grafana/
                            +
                            +
                            +

                            If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                            +

                            For example:

                            +
                            cp -r grafana/plugins ../grafana-7.5.7/public/app
                            +
                            +
                            +
                              +
                            1. Provision the Dashboards

                            2. +
                            +

                            For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                            +

                            For Grafana installed with yum install

                            +
                            sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                            +sudo mkdir -p /var/lib/grafana/dashboards
                            +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                            +
                            +
                            +

                            For Grafana installed from packages

                            +
                            cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                            +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                            +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                            +
                            +
                            +

                            Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                            +
                            +

                            Note

                            +

                            A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                            +
                            +
                              +
                            1. Set the data source by copy datasource.yml and edit it

                            2. +
                            +
                            sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                            +
                            +
                            +
                            +

                            Note

                            +

                            Scylla uses a plugin to read from some system tables see the section below about using it.

                            +
                            +

                            For Grafana installed from packages

                            +
                            cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                            +
                            +
                            +

                            You should set the Prometheus and the alertmanager IP and port.

                            +

                            For example

                            +
                            sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                            +apiVersion: 1
                            +datasources:
                            + - name: prometheus
                            +   type: prometheus
                            +   url: http://192.168.135.167:9090
                            +   access: proxy
                            +   basicAuth: false
                            +
                            + - name: alertmanager
                            +   type: camptocamp-prometheus-alertmanager-datasource
                            +   orgId: 1
                            +   typeLogoUrl: public/img/icn-datasource.svg
                            +   access: proxy
                            +   url: http://192.168.135.166:9093
                            +   password:
                            +   user:
                            +   database:
                            +   basicAuth:
                            +   isDefault:
                            +   jsonData:
                            +     severity_critical: '4'
                            +     severity_high: '3'
                            +     severity_warning: '2'
                            +     severity_info: '1'
                            +
                            +
                            +
                              +
                            1. Start the Grafana service

                            2. +
                            +

                            For Grafana installed with yum install

                            +

                            sudo service grafana-server start

                            +

                            For Grafana installed from packages:

                            +

                            cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                            +

                            Edit scylla.ini to reflect the right paths in the paths section of the file.

                            +
                            plugins = /home/centos/grafana-7.5.7/data/plugins
                            +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                            +
                            +
                            +

                            Start the server:

                            +
                            cd /home/centos/grafana-7.5.7/
                            +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                            +
                            +
                            +
                              +
                            1. Make sure Grafana is running

                            2. +
                            +

                            Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                            +../_images/grafana.png +
                            +
                            +

                            Using Scylla Plugin with Grafana

                            +

                            Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                            +

                            Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                            +
                            +

                            Setting a monitoring user

                            +

                            This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                            +
                              +
                            • If you have not done so, enable authorization first.

                            • +
                            • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                            • +
                            • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                            • +
                            +
                            +
                            +

                            Installing the Plugin

                            +

                            Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                            +
                            +
                            +

                            Configure the Plugin

                            +

                            Add an entry to the datasource.yml file

                            +
                            - name: scylla-datasource
                            +  type: scylladb-scylla-datasource
                            +  orgId: 1
                            +  isDefault:
                            +  jsonData:
                            +  host: ''
                            +#  secureJsonData:
                            +#    user: 'scylla_monitoring'
                            +#    password: 'scylla_monitoring'
                            +
                            +
                            +

                            As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                            +
                            +
                            +

                            Enable the Plugin

                            +

                            Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                            +

                            See more about it the Grafana configurtion.

                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/monitoring-stack.html b/branch-4.4/install/monitoring-stack.html new file mode 100644 index 000000000..310b64e20 --- /dev/null +++ b/branch-4.4/install/monitoring-stack.html @@ -0,0 +1,1115 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Install Scylla Monitoring Stack

                            +

                            This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                            +

                            The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                            +

                            For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                            +
                            +

                            Minimal Production System Recommendations

                            +
                              +
                            • CPU - at least 2 physical cores/ 4vCPUs

                            • +
                            • Memory - 15GB+ DRAM and proportional to the number of cores.

                            • +
                            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                            • +
                            • Network - 1GbE/10GbE preferred

                            • +
                            +
                            +

                            Calculating Prometheus Minimal Disk Space requirement

                            +

                            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                            +

                            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                            +

                            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                            +
                            6 * 16 * 15 * 12MB ~ 16GB
                            +
                            +
                            +

                            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                            +
                            +
                            +

                            Calculating Prometheus Minimal Memory Space requirement

                            +

                            Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                            +

                            For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                            + +
                            + +++++++ + + + +
                            # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                            00
                            + +
                            +
                            +
                            +
                            +

                            Prerequisites

                            +
                              +
                            • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                            • +
                            • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                            • +
                            + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            Scylla Monitoring Stack Compatibility Matrix

                            Scylla Monitoring Stack Version

                            Prometheus Version

                            Grafana Version

                            4.5

                            2.45.0

                            10.0.2

                            4.4

                            2.44.0

                            9.5.2

                            4.3

                            2.42.0

                            9.3.8

                            4.2

                            2.41.0

                            9.3.4

                            4.1

                            2.38.0

                            9.1.0

                            4.0

                            2.34.0

                            8.5.2

                            3.11

                            2.32.0

                            8.3.4

                            3.10

                            2.32.0

                            8.3.3

                            3.9.2

                            2.29.1

                            8.2.7

                            3.9

                            2.29.1

                            8.1.1

                            3.8

                            2.27.1

                            7.5.7

                            3.7

                            2.25.2

                            7.4.0

                            3.6

                            2.18.1

                            7.3.5

                            3.5

                            2.18.1

                            7.1.5

                            3.4

                            2.18.1

                            6.7.3

                            +
                            +
                            +

                            Docker Post Installation

                            +

                            Docker post installation guide can be found here

                            +
                            +

                            Note

                            +

                            Avoid running the container as root.

                            +
                            +

                            To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                            +
                              +
                            1. Create the Docker group.

                            2. +
                            +
                            sudo groupadd docker
                            +
                            +
                            +
                              +
                            1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                            2. +
                            +
                            sudo usermod -aG docker $USER
                            +
                            +
                            +
                              +
                            1. Start Docker by calling:

                            2. +
                            +
                            sudo systemctl enable docker
                            +
                            +
                            +
                            +
                            +

                            Install Scylla Monitoring Stack

                            +

                            Procedure

                            +
                              +
                            1. Download and extract the latest Scylla Monitoring Stack binary;.

                            2. +
                            +
                            wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.4.5.tar.gz
                            +tar -xvf scylla-monitoring-4.4.5.tar.gz
                            +cd scylla-monitoring-scylla-monitoring-4.4.5
                            +
                            +
                            +

                            As an alternative, you can clone and use the Git repository directly.

                            +
                            git clone https://github.com/scylladb/scylla-monitoring.git
                            +cd scylla-monitoring
                            +git checkout branch-4.4
                            +
                            +
                            +
                              +
                            1. Start Docker service if needed

                            2. +
                            +
                            sudo systemctl restart docker
                            +
                            +
                            +
                            +
                            +

                            Configure Scylla Monitoring Stack

                            +

                            To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                            +

                            This configuration can be done from files, or using the Consul api.

                            +

                            Scylla Manager 2.0 and higher supports the Consul API.

                            +
                            +

                            Configure Scylla nodes from files

                            +
                              +
                            1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                            2. +
                            +
                            +

                            Note

                            +

                            It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                            +
                            +

                            For example:

                            +
                            - targets:
                            +      - 172.17.0.2
                            +      - 172.17.0.3
                            +  labels:
                            +      cluster: cluster1
                            +      dc: dc1
                            +
                            +
                            +
                            +

                            Note

                            +

                            If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                            +
                            +

                            Using IPV6

                            +

                            To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                            +

                            For example:

                            +
                            - targets:
                            +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                            +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                            +  labels:
                            +      cluster: cluster1
                            +      dc: dc1
                            +
                            +
                            +
                            +

                            Note

                            +

                            For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                            +
                            +

                            For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                            +
                            +

                            Note

                            +

                            By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                            +
                            +

                            If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                            +

                            For example:

                            +
                            ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                            +
                            +
                            +

                            Mark the different Data Centers with Labels.

                            +

                            As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                            +

                            You can use the genconfig.py script to generate the server file. For example:

                            +
                            ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                            +
                            +
                            +

                            This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                            +

                            OR

                            +

                            The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                            +
                            nodetool status | ./genconfig.py -NS
                            +
                            +
                            +

                            2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                            +

                            You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                            +

                            For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                            +
                            # List Scylla Manager end points
                            +
                            +- targets:
                            +  - 172.17.0.7:5090
                            +
                            +
                            +

                            Note that you do not need to add labels to the Scylla Manager targets.

                            +
                            +
                            +

                            Configure Scylla nodes using Scylla-Manager Consul API

                            +

                            Scylla Manager 2.0 has a Consul like API.

                            +

                            When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                            +

                            For example:

                            +
                            ./start-all.sh -L 10.10.0.1
                            +
                            +
                            +
                            +

                            Note

                            +

                            If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                            +
                            +
                            +
                            +

                            Connecting Scylla-Monitoring to ScyllaDB

                            +

                            Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                            +

                            You can limit the user to read only, currently it only read table from the system keyspace.

                            +

                            You can set a user and password from a file or environment variables.

                            +

                            If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                            +

                            To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                            +
                            +

                            Note

                            +

                            It is best to use a dedicated user and password with limited privileges.

                            +
                            +
                            +
                            +

                            Use an external directory for the Prometheus data directory

                            +

                            The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                            +
                            +

                            Note

                            +

                            Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                            +
                            +

                            If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                            +

                            In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                            +
                            +
                            +

                            Add Additional Prometheus Targets

                            +

                            There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                            +

                            The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                            +

                            You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                            +
                            - job_name: 'myservice'
                            +  # Override the global default and scrape targets from this job every 5 seconds.
                            +  scrape_interval: 5s
                            +  static_configs:
                            +    - targets:
                            +      - 17.0.0.1:7000
                            +
                            +
                            +
                            +
                            +
                            +

                            Start and Stop Scylla Monitoring Stack

                            +
                            +

                            Start

                            +
                            ./start-all.sh -d prometheus_data
                            +
                            +
                            +
                            +
                            +

                            Stop

                            +
                            ./kill-all.sh
                            +
                            +
                            +
                            +
                            +

                            Start a Specific Scylla Monitoring Stack Version

                            +

                            By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                            +

                            You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                            +

                            Multiple versions are supported. For example:

                            +
                            ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                            +
                            +
                            +

                            will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                            +
                            +
                            +

                            Accessing the localhost

                            +

                            The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                            +
                            ./start-all.sh -l -d prometheus-data
                            +
                            +
                            +
                            +
                            +

                            Configure rsyslog on each Scylla node

                            +

                            generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                            +

                            Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                            +

                            Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                            +

                            If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                            +
                            if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                            +
                            +
                            +

                            Restart rsyslog for the configuration to take effect.

                            +
                            systemctl restart rsyslog
                            +
                            +
                            +
                            +
                            +
                            +

                            View Grafana Dashboards

                            +

                            Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/start-all.html b/branch-4.4/install/start-all.html new file mode 100644 index 000000000..67d9b946e --- /dev/null +++ b/branch-4.4/install/start-all.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            The start-all.sh Command

                            +

                            Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                            +

                            The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                            +
                            +

                            General Options

                            +

                            -h Help, Print the help, and exit.

                            +

                            –version print the current Scylla-Monitoring stack version, and exit.

                            +

                            -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                            +

                            -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                            +

                            -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                            +

                            –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                            +
                            + + +
                            +

                            Alert Manager

                            +

                            The Alertmanager handles the alerts and takes the following parameters:

                            +

                            -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                            +

                            -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                            +

                            -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/thanos.html b/branch-4.4/install/thanos.html new file mode 100644 index 000000000..74f16f46d --- /dev/null +++ b/branch-4.4/install/thanos.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Using Thanos as Data Source With Scylla Monitoring Stack

                            +

                            Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                            +
                              +
                            • High-availability.

                            • +
                            • Horizontal scaling.

                            • +
                            • Backup.

                            • +
                            +

                            The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                            +

                            The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                            +
                            +

                            Using Thanos As a Prometheus Aggregator

                            +

                            There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                            +
                            +

                            Prometheus Configuration

                            +

                            We will assume you have two Prometheus servers running.

                            +
                              +
                            1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                            2. +
                            3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                            4. +
                            +
                            +
                            +

                            Thanos sidecar

                            +

                            The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                            +
                            docker run -d \
                            + -v /path/to/prom/dir:/data/prom:z \
                            + -i --name sidecar thanosio/thanos \
                            + sidecar \
                            + --grpc-address=0.0.0.0:10911 \
                            + --grpc-grace-period=1s \
                            + --http-address=0.0.0.0:10912 \
                            + --http-grace-period=1s \
                            + --prometheus.url=http://prometheus-ip:9090 \
                            + --tsdb.path=/data/prom \
                            + -p 10912:10912 \
                            + -p 10911:10911
                            +
                            +
                            +

                            After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                            +
                            +
                            +

                            Thanos query

                            +

                            Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                            +
                            docker run -d \
                            + --name thanos -- thanosio/thanos \
                            +   query \
                            +   --debug.name=query0 \
                            +   --log.level=debug \
                            +   --grpc-address=0.0.0.0:10903 \
                            +   --grpc-grace-period=1s \
                            +   --http-address=0.0.0.0:10904 \
                            +   --http-grace-period=1s \
                            +   --query.replica-label=prometheus \
                            +   --store={ip1}:10911 --store={ip2}:10911
                            +
                            +
                            +

                            After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                            +
                            +
                            +

                            Update Scylla Data source

                            +

                            The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                            +

                            The file you edit is a template file that replaces the file Grafana uses, next time you start.

                            +

                            Restart the Scylla Monitoring Stack it should now use Thanos.

                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/intro.html b/branch-4.4/intro.html new file mode 100644 index 000000000..e4b589d67 --- /dev/null +++ b/branch-4.4/intro.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            ScyllaDB Monitoring Stack

                            +

                            ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                            +_images/monitor.png +

                            The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                            +
                              +
                            • prometheus - Collects and stores metrics

                            • +
                            • grafan-loki - Parses logs and generates metrics and alerts

                            • +
                            • alertmanager - Handles alerts

                            • +
                            • grafana - Dashboards server

                            • +
                            +

                            A few optional components are used for additional services

                            +
                              +
                            • grafana-image-renderer - Allows you to download a dashboard as an image.

                            • +
                            • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                            • +
                            +
                            +

                            High Level Architecture

                            +_images/monitoring_stack1.png +

                            We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                            +

                            We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                            +

                            The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                            +

                            We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                            +

                            Choose a topic to get started:

                            + +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/objects.inv b/branch-4.4/objects.inv new file mode 100644 index 000000000..2e0b5512d Binary files /dev/null and b/branch-4.4/objects.inv differ diff --git a/branch-4.4/procedures/alerts/alerting.html b/branch-4.4/procedures/alerts/alerting.html new file mode 100644 index 000000000..10c0e9d1f --- /dev/null +++ b/branch-4.4/procedures/alerts/alerting.html @@ -0,0 +1,766 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Alerting

                            +

                            Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                            +

                            You can read more about Prometheus alerting here

                            +

                            By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                            +

                            In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                            +

                            The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                            +../../_images/monitoring_stack.png +
                            +

                            Prometheus Alerts

                            +

                            The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                            +

                            Each alert consists of:

                            +
                              +
                            • Name

                            • +
                            • What happened

                            • +
                            • For how long

                            • +
                            • What to report

                            • +
                            +

                            For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                            +
                            - alert: InstanceDown
                            +  expr: up == 0
                            +  for: 60s
                            +  labels:
                            +    severity: "2"
                            +  annotations:
                            +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                            +    summary: Instance {{ $labels.instance }} down
                            +
                            +
                            +

                            The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                            +

                            The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                            +

                            The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                            +

                            annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                            +
                            +
                            +

                            Alertmanager

                            +

                            The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                            +

                            The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                            +
                              +
                            • Routes: Represent a routing tree, the most specific rule, wins

                            • +
                            • Inhibition: Mute an alert, based on another alert

                            • +
                            • Receiver: Send a notification via email, sluck, etc’

                            • +
                            +

                            Check the Alertmanager documentation for details on how to specify a specific receiver.

                            +

                            In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                            +
                            +
                            +

                            Tips When Adding an Alert

                            +

                            It’s worse having an alert that does not work, than not having an alert at all

                            +

                            There are multiple ways you can use to make sure your alert is set correctly:

                            +
                              +
                            • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                            • +
                            • Force the alert to be active by reducing the limits or the duration.

                            • +
                            • When possible simulate the actual scenario and see that the alert works as expected.

                            • +
                            +

                            For example, low available disk space.

                            +

                            Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                            +

                            Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                            +

                            Starting with a simple working expression helps you bisect problems.

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/procedures/alerts/index.html b/branch-4.4/procedures/alerts/index.html new file mode 100644 index 000000000..e1a5850b2 --- /dev/null +++ b/branch-4.4/procedures/alerts/index.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Stack Alert Manager

                            +
                            +
                            +

                            Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/procedures/datadog/index.html b/branch-4.4/procedures/datadog/index.html new file mode 100644 index 000000000..c5f26af87 --- /dev/null +++ b/branch-4.4/procedures/datadog/index.html @@ -0,0 +1,763 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Datadog Integration

                            +

                            The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                            +
                              +
                            1. Installing and configuring the Datadog Agent.

                            2. +
                            3. Add Datadog recording rules.

                            4. +
                            5. Loading Scylla dashboard to Datadog.

                            6. +
                            7. Optionally load Monitor (Alerts).

                            8. +
                            +
                            +

                            Note

                            +

                            Scylla Cloud users, use and update the proper configuration file.

                            +
                            +
                            +

                            Install And configure the Datadog Agent

                            +

                            Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                            +

                            Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                            +
                            +

                            Scylla Cloud Users

                            +

                            Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                            +

                            Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                            +
                            +
                            +

                            Other Scylla Users

                            +

                            Other Scylla users, download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                            +
                            +
                            +

                            Post configuration

                            +

                            Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                            +
                            +

                            Note

                            +

                            By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                            +
                            +
                            +
                            +
                            +

                            Add datadog recording rules

                            +

                            Non Scylla Cloud users, download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                            +

                            Cloud users, skip this step, it’s been take care for by the cloud.

                            +
                            +
                            +

                            Upload the Dashboard

                            +

                            Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                            +
                            +
                            +

                            Using the Dashboard

                            +

                            We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                            +../../_images/datadog.png +

                            The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                            +
                            +

                            Note

                            +

                            Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                            +
                            +
                            +
                            +

                            Adding Monitor

                            +

                            Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/procedures/index.html b/branch-4.4/procedures/index.html new file mode 100644 index 000000000..bcc9c367b --- /dev/null +++ b/branch-4.4/procedures/index.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            ScyllaDB Monitoring Stack Procedures

                            +
                            +
                            +

                            There are several reference guides available which give additional information. Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/procedures/updating-dashboard.html b/branch-4.4/procedures/updating-dashboard.html new file mode 100644 index 000000000..39e61b3af --- /dev/null +++ b/branch-4.4/procedures/updating-dashboard.html @@ -0,0 +1,975 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Adding and Modifying Dashboards

                            +

                            This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                            +

                            It covers dashboard templates and how to modify them.

                            + +
                            +

                            General Limitations

                            +

                            Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                            +
                            +

                            Consistency Between Restarts

                            +

                            By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                            +
                            +
                            +

                            Consistency Between Upgrades

                            +

                            As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                            +
                            +

                            Note

                            +

                             You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                            +
                            +

                            At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                            +
                            +
                            +
                            +

                            Using Templated Dashboards

                            +

                            Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                            +

                            Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                            +

                            For example a typical graph panel would look like this:

                            +
                            {
                            +    "aliasColors": {},
                            +    "bars": false,
                            +    "datasource": "prometheus",
                            +    "editable": true,
                            +    "error": false,
                            +    "fill": 0,
                            +    "grid": {
                            +        "threshold1": null,
                            +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                            +        "threshold2": null,
                            +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                            +    },
                            +    "gridPos": {
                            +        "h": 6,
                            +        "w": 10,
                            +        "x": 0,
                            +        "y": 4
                            +    },
                            +    "id": 2,
                            +    "isNew": true,
                            +    "legend": {
                            +        "avg": false,
                            +        "current": false,
                            +        "max": false,
                            +        "min": false,
                            +        "show": false,
                            +        "total": false,
                            +        "values": false
                            +    },
                            +    "lines": true,
                            +    "linewidth": 2,
                            +    "links": [],
                            +    "nullPointMode": "connected",
                            +    "percentage": false,
                            +    "pointradius": 5,
                            +    "points": false,
                            +    "renderer": "flot",
                            +    "seriesOverrides": [
                            +        {}
                            +    ],
                            +    "span": 5,
                            +    "stack": false,
                            +    "steppedLine": false,
                            +    "targets": [
                            +        {
                            +            "expr": "sum(node_filesystem_avail) by (instance)",
                            +            "intervalFactor": 1,
                            +            "legendFormat": "",
                            +            "refId": "A",
                            +            "step": 1
                            +        }
                            +    ],
                            +    "timeFrom": null,
                            +    "timeShift": null,
                            +    "title": "Available Disk Size",
                            +    "tooltip": {
                            +        "msResolution": false,
                            +        "shared": true,
                            +        "sort": 0,
                            +        "value_type": "cumulative"
                            +    },
                            +    "transparent": false,
                            +    "type": "graph",
                            +    "xaxis": {
                            +        "show": true
                            +    },
                            +    "yaxes": [
                            +        {
                            +            "format": "percent",
                            +            "logBase": 1,
                            +            "max": 101,
                            +            "min": 0,
                            +            "show": true
                            +        },
                            +        {
                            +            "format": "short",
                            +            "logBase": 1,
                            +            "max": null,
                            +            "min": null,
                            +            "show": true
                            +        }
                            +    ]
                            +}
                            +
                            +
                            +

                            As you can imagine, most panels would have similar values.

                            +

                            To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                            +
                            +

                            The Template Class System

                            +

                            The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                            +

                            The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                            +

                            In the template file, you can also add or override attributes.

                            +

                            The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                            +

                            When generating dashboards, each class will be replaced by its definition.

                            +

                            For example, a row in the type.json is defined as:

                            +
                            {
                            + "base_row": {
                            +     "collapse": false,
                            +     "editable": true
                            + },
                            + "row": {
                            +     "class": "base_row",
                            +     "height": "250px"
                            + }
                            + }
                            +
                            +
                            +

                            Will be used like in a template:

                            +
                            {
                            +     "class": "row",
                            +     "height": "150px",
                            +     "panels": [
                            +     ]
                            +}
                            +
                            +
                            +

                            And the output will be:

                            +
                            {
                            +     "class": "row",
                            +     "collapse": false,
                            +     "editable": true,
                            +     "height": "150px",
                            +     "panels": [
                            +
                            +     ]
                            +}
                            +
                            +
                            +

                            We can see that the template added the panels attribute and that it overrides the height attribute.

                            +
                            +
                            +

                            Panel Example

                            +

                            Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                            +
                            {
                            +     "class": "row",
                            +     "panels": [
                            +         {
                            +             "class": "bytes_panel",
                            +             "span": 3,
                            +             "targets": [
                            +                 {
                            +                     "expr": "sum(node_filesystem_avail) by (instance)",
                            +                     "intervalFactor": 1,
                            +                     "legendFormat": "",
                            +                     "metric": "",
                            +                     "refId": "A",
                            +                     "step": 1
                            +                 }
                            +             ],
                            +             "title": "Available Disk Size"
                            +         }
                            +     ]
                            +}
                            +
                            +
                            +

                            In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                            +

                            You can also see that the span attribute is overridden to set the panel size.

                            +

                            To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                            +
                            +
                            +

                            Grafana Formats and Layouts

                            +

                            The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                            +

                            Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                            +

                            The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                            +

                            To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                            +

                            The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                            +

                            You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                            +

                            gridPos has the following attributes:

                            +
                            {
                            +   "x": 0,
                            +   "y": 0,
                            +   "w": 24,
                            +   "h": 4
                            + }
                            +
                            +
                            +

                            When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                            +
                            {
                            +   "gridPos": {
                            +      "h": 2
                            +    }
                            +}
                            +
                            +
                            +
                            +
                            +

                            Generating the dashboards from templates (generate-dashboards.sh)

                            +
                            +

                            Prerequisite

                            +

                            Python 2.7

                            +

                            make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                            +

                            Use the -h flag to get help information.

                            +

                            You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                            +

                            When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                            +

                            For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                            +

                            .\generate-dashboards.sh -v 2020.1

                            +
                            +

                            Note

                            +

                            generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                            +
                            +
                            +
                            +
                            +

                            Validation

                            +

                            After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                            +

                            Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/reference/index.html b/branch-4.4/reference/index.html new file mode 100644 index 000000000..032be0fde --- /dev/null +++ b/branch-4.4/reference/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Stack Reference Guide

                            +
                            +
                            +

                            There are several reference guides available which give additional information. Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/reference/matrix.html b/branch-4.4/reference/matrix.html new file mode 100644 index 000000000..f4597cd0d --- /dev/null +++ b/branch-4.4/reference/matrix.html @@ -0,0 +1,865 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Stack Support Matrix

                            +

                            The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                            + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                            Scylla Monitoring Stack Version

                            Scylla Open Source Version

                            Scylla Enterprise Version

                            Node_exporter[1] Version

                            Scylla Manager Version

                            4.5

                            5.0,5.1,5.2,5.4

                            2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                            1.4.1

                            3.0, 3.1, 3.2

                            4.4.5

                            5.0,5.1,5.2,5.4

                            2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                            1.4.1

                            3.0, 3.1, 3.2

                            4.4

                            5.0,5.1,5.2

                            2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                            1.4.1

                            3.0, 3.1

                            4.3

                            5.0,5.1,5.2

                            2020.1, 2021.1, 2022.1, 2022.2

                            1.4.1

                            2.5, 2.6, 3.0

                            4.2

                            4.5,4.6,5.0,5.1

                            2020.1, 2021.1, 2022.1, 2022.2

                            1.4.1

                            2.5, 2.6, 3.0

                            4.1

                            4.5,4.6,5.0,5.1

                            2020.1, 2021.1, 2022.1, 2022.2

                            0.17

                            2.5, 2.6, 3.0

                            4.0

                            4.3, 4.4, 4.5, 4.6, 5.0

                            2020.1, 2021.1, 2022.1

                            0.17

                            2.3, 2.4, 2.5, 2.6, 3.0

                            3.11

                            4.3, 4.4, 4.5, 4.6, 5.0

                            2020.1, 2021.1, 2022.2

                            0.17

                            2.3, 2.4, 2.5, 2.6

                            3.10

                            4.3, 4.4, 4.5, 4.6

                            2020.1, 2021.1

                            0.17

                            2.3, 2.4, 2.5, 2.6

                            3.9

                            4.3, 4.4, 4.5, 4.6

                            2020.1, 2021.1

                            0.17

                            2.3, 2.4, 2.5

                            3.8

                            4.3, 4.4, 4.5

                            2020.1, 2021.1

                            0.17

                            2.3, 2.4, 2.5

                            3.7

                            4.2, 4.3, 4.4

                            2019.1, 2020.1, 2021.1

                            0.17

                            2.2, 2.3

                            3.6.3

                            4.2, 4.3, 4.4

                            2019.1, 2020.1, 2021.1

                            0.17

                            2.2, 2.3, 2.1

                            3.6

                            4.1, 4.2, 4.3

                            2019.1, 2020.1

                            0.17

                            2.1, 2.2, 2.3

                            3.6.1

                            4.1, 4.2, 4.3

                            2019.1, 2020.1

                            0.17

                            2.1, 2.2

                            3.6.1

                            4.1, 4.2, 4.3, 4.4

                            2019.1, 2020.1

                            0.17

                            2.1, 2.2

                            3.5

                            3.3, 4.0, 4.1, 4.2

                            2019.1, 2020.1

                            0.17

                            2.0, 2.1, 2.2

                            3.4.3

                            3.3, 4.0, 4.1, 4.2

                            2019.1, 2020.1

                            0.17

                            2.0, 2.1

                            3.4

                            3.3, 4.0, 4.1

                            2018.1, 2019.1

                            0.17

                            2.0, 2.1

                            3.3

                            3.1, 3.2, 3.3, 4.0

                            2018.1, 2019.1

                            0.17

                            1.4, 2.0, 2.1

                            3.2

                            3.1, 3.2, 3.3

                            2018.1, 2019.1

                            0.17

                            1.4, 2.0

                            3.1

                            2.3, 3.0, 3.1, 3.2

                            2018.1, 2019.1

                            0.17

                            1.3, 1.4, 2.0

                            3.0

                            2.3, 3.0, 3.1, 3.2

                            2018.1, 2019.1

                            0.17

                            1.3, 1.4

                            2.4

                            2.3, 3.0, 3.1

                            2018.1, 2019.1

                            0.14, 0.17

                            1.3, 1.4

                            2.3

                            2.3, 3.0

                            2018.1, 2019.1

                            0.14, 0.17

                            1.3

                            2.2

                            2.3, 3.0

                            2018.1, 2019.1

                            0.14, 0.17

                            1.3

                            2.1

                            2.3, 3.0

                            2018.1

                            0.14, 0.17

                            1.3

                            +

                            [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/reference/monitoring-apis.html b/branch-4.4/reference/monitoring-apis.html new file mode 100644 index 000000000..83c682696 --- /dev/null +++ b/branch-4.4/reference/monitoring-apis.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Stack Interfaces

                            +

                            Scylla exposes two interfaces for online monitoring, as described below

                            +
                            +

                            Prometheus API

                            +

                            By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                            +

                            For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                            +

                            You can change the Prometheus listening address and port in scylla.yaml file

                            +
                            # prometheus port
                            +# By default, Scylla opens prometheus API port on port 9180
                            +# setting the port to 0 will disable the prometheus API.
                            +prometheus_port: 9180
                            +#
                            +# prometheus address
                            +# By default, Scylla binds all interfaces to the prometheus API
                            +# It is possible to restrict the listening address to a specific one
                            +prometheus_address: 0.0.0.0
                            +
                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/robots.txt b/branch-4.4/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.4/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.4/search.html b/branch-4.4/search.html new file mode 100644 index 000000000..67acc4a50 --- /dev/null +++ b/branch-4.4/search.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + + + +
                            + + + + + +
                            + + +
                            + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/searchindex.js b/branch-4.4/searchindex.js new file mode 100644 index 000000000..5accdbed0 --- /dev/null +++ b/branch-4.4/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "5": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 28, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "monitor": [0, 2, 4, 7, 10, 14, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "scylladb": [0, 2, 4, 5, 19, 21, 22, 23, 24, 25, 30, 31, 33, 34, 36, 38, 39], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 27, 28, 29, 30, 33, 34, 35, 36, 38, 40, 41, 42], "full": [0, 1, 3, 6, 9, 10, 27], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 36, 38, 40], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 30, 34, 40, 42], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 40], "tool": [0, 1, 3, 9, 19, 42], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 26, 42], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25, 26], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 26, 35, 42, 43], "consist": [1, 9, 10, 12, 21, 35], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 19, 23, 25, 36, 38], "store": [1, 5, 8, 9, 14, 22, 24, 25, 26, 28, 29, 40], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 26, 42], "alertmanag": [1, 2, 7, 9, 22, 24, 25, 26], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 27, 42], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 43], "topic": [1, 3, 9, 11, 13, 15, 18, 43], "get": [1, 6, 8, 9, 10, 14, 25, 28, 35, 39, 40, 41, 42], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 26, 34], "user": [1, 2, 6, 7, 9, 27, 42], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25, 26], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9, 33], "refer": [1, 6, 9, 13], "upgrad": [1, 13], "lesson": [1, 9, 29, 30], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25, 26], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 27, 42], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 30, 32, 34, 35, 41, 42, 43], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 27, 30, 34, 35, 42, 43], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 27, 31, 35, 42], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25, 26], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 32, 33, 35, 36, 38, 40, 42], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 28, 31, 36, 42], "more": [2, 4, 5, 6, 10, 14, 17, 19, 27, 30, 33, 34, 36, 39, 42], "manual": [2, 19], "step": [2, 5, 8, 12, 14, 19, 21, 22, 23, 24, 25, 26], "onc": [2, 12, 21, 25, 32, 40, 42], "configur": [2, 7, 10, 14, 17, 19, 21, 34, 35], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 26, 34, 35, 36, 37, 40, 41, 42, 43], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 26, 35, 40, 42], "wai": [2, 5, 7, 10, 12, 19, 25, 33, 42], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 28, 31, 32, 33, 39, 42], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 26, 28, 30, 31, 34, 35, 36, 42], "both": [2, 5, 6, 12, 19, 22, 24, 25, 26, 42], "In": [2, 6, 10, 14, 19, 21, 25, 34, 42], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 27, 40, 42], "updat": [2, 5, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 34, 42], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 26, 29, 34, 35, 36, 41, 42], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 35, 42], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 42], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25, 26], "among": [2, 35], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25, 26], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 35], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 26, 42], "consul": [2, 7], "manag": [2, 5, 13, 16, 18], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 42], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 35, 36, 42], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 35, 36, 39, 42], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 26, 28, 34, 35, 42], "advis": [2, 35], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 26, 42], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26], "databas": [2, 5, 7, 21, 30, 42], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 34, 42], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 27, 31, 34], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 27, 33, 37, 42], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25, 26], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 42], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 33, 34, 36, 38, 40, 42], "differ": [2, 5, 6, 7, 8, 14, 21, 22, 23, 24, 25, 26, 32, 33, 42], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 34, 41], "follow": [2, 4, 5, 6, 7, 12, 14, 16, 19, 21, 22, 24, 25, 26, 34, 42], "command": [2, 6, 8, 19, 21, 22, 24, 25, 26, 34], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 12, 25], "yaml": [2, 5, 12, 17], "To": [2, 4, 5, 6, 12, 14, 17, 21, 22, 23, 24, 25, 26], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 34], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25, 26], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 34], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "1": [2, 5, 6, 7, 8, 12, 14, 16, 20, 22, 24, 25, 26], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 28, 31, 34, 35, 37, 41, 42], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 26, 28, 29, 30, 42], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "24": [2, 14, 25], "0": [2, 5, 6, 7, 8, 10, 14, 16, 17, 21, 22, 23, 24, 25, 26], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25, 26], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25, 26], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 34], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 14, 19, 22, 24, 25, 26], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 25, 35], "json": [2, 12, 14], "9": [2, 6, 16, 25], "3": [2, 4, 5, 6, 14, 16, 20, 36], "11": [2, 6, 16], "3000": [2, 5, 6, 22, 24, 25, 26], "1000": [2, 34], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 14, 29, 36, 38, 42], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25, 26], "dir": [2, 7, 8, 22, 24, 25, 26], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 10, 12, 14, 16, 20, 24, 36], "7": [2, 5, 6, 14, 16], "3100": [2, 5], "rule": [2, 5, 7, 10, 19, 25, 32, 41], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "42": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25, 26], "prom_rul": [2, 5, 12, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25, 26], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 19, 21, 25, 42], "down": [2, 10, 19, 21, 22, 24, 25, 26, 28, 34, 36], "begin": [3, 11, 13, 15, 18, 43], "deploi": [3, 6], "without": [3, 6, 7, 14, 19, 21, 25], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 26, 30, 35, 36, 38, 40, 42], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 41], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 26, 34, 36, 40], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 19, 21, 34, 40], "section": [4, 5, 6, 12, 19, 21, 24, 25, 26, 42], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 19, 25, 34, 35, 39, 42], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 30, 36, 38, 42], "default": [4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 25, 31, 42], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 19, 42], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25, 26], "scrape": [4, 5, 6], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 39], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 28, 29, 30, 35, 36, 38, 39, 42], "cluster": [4, 5, 6, 12, 19, 25, 33, 42], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 28, 30, 35, 40, 42], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 25, 30, 42], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 32, 40, 42], "need": [4, 5, 6, 7, 8, 12, 14, 19, 25, 28, 29, 30, 41, 42], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 37, 41, 42], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25, 26], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 26, 42], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 28, 34, 42], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 40, 42], "fast": [4, 5, 6, 41], "enough": [4, 5, 6, 41], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 28, 35, 42], "out": [4, 5, 6, 8, 41], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 35, 36, 38], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 7, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25, 26], "look": [4, 5, 6, 8, 10, 12, 14, 25, 42], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 27, 30, 42], "take": [4, 5, 6, 7, 12, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 42], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 35], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 36], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 42], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25, 26], "help": [5, 7, 10, 14, 42], "pleas": [5, 19], "most": [5, 10, 14, 25, 35, 37, 42], "common": [5, 7, 42], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 19], "standalon": [5, 19], "thei": [5, 6, 7, 10, 14, 39, 40], "alreadi": [5, 22, 24, 25, 26], "consolid": 5, "componen": 5, "suggest": [5, 14, 25], "those": [5, 25], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 40], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 28, 42], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 30, 35, 36, 38, 39, 41, 42], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 26, 28, 29, 36, 42], "support": [5, 6, 14, 15, 27, 33, 42], "want": [5, 6, 10, 22, 24, 25, 26], "latest": [5, 6, 7, 22, 24, 25, 26], "releas": [5, 21, 22, 23, 24, 25, 26], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25, 26], "http": [5, 6, 8, 19, 21, 22, 24, 25, 26, 30, 31, 33, 39], "com": [5, 6, 22, 24, 25, 26, 30, 31, 33, 39], "archiv": [5, 6, 22, 24, 25, 26], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25, 26], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 42], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 19, 21, 22, 23, 24, 26], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 34], "cp": [5, 22, 23, 24, 25, 26], "p": [5, 7, 8, 19, 21, 22, 24, 25, 26], "cd": [5, 6, 22, 24, 25, 26], "verifi": [5, 23], "point": [5, 6, 14, 22, 24, 25, 26], "browser": [5, 6, 8, 14, 19, 22, 24, 25, 26], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 26, 37, 38, 42], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 26, 42], "describ": [5, 6, 8, 17, 19, 42], "respons": [5, 10], "pars": [5, 9, 14, 32, 42], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 36, 38], "load": [5, 6, 12, 19, 25, 27, 30, 31, 42], "multipl": [5, 6, 7, 8, 9, 10, 14, 28, 31, 32, 39, 41, 42], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 26, 30, 34, 42], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24, 26], "relat": [5, 42], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 42], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 12, 14, 27, 28, 37, 40, 42], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 34, 37, 39, 40, 41, 42], "besid": [5, 7, 21, 42], "expect": [5, 10, 22, 24, 25, 26], "scrap": [5, 7, 12], "job": [5, 6, 19], "onli": [5, 6, 7, 12, 19, 21, 23, 25, 30, 32, 34, 40, 42], "import": [5, 6, 7, 12, 21, 22, 24, 25, 26, 34], "record": [5, 7, 19, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25, 26], "code": [5, 35], "shell": 5, "correct": [5, 23], "static": [5, 34], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 33], "host": [5, 6, 7, 9, 19], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23], "127": [5, 7, 19], "right": [5, 6, 14, 35, 42], "typic": [5, 14, 25, 28, 30, 40, 42], "node_export": [5, 6, 7, 9, 16], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 31, 42], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 41], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 35, 42], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 39, 41, 43], "instead": [5, 6, 8, 19, 25, 42], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 36], "even": [5, 6, 7, 19], "center": [5, 6, 8, 42], "cat": 5, "list": [5, 6], "end": [5, 6, 21, 42], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25, 26], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 27, 32], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24, 26], "scylla_reactor_util": 5, "At": [5, 14, 24, 25, 26], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 35], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25, 26], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 28, 29, 36, 40, 42], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 42], "otherwis": 5, "some": [5, 8, 10, 12, 19, 25, 35, 39], "tabl": [5, 6, 10, 16, 27, 35, 42], "apivers": 5, "type": [5, 14, 42], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 35, 43], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 26, 34, 35, 42], "give": [5, 13, 15], "strongli": 5, "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 27, 30, 35, 42], "option": [5, 6, 8, 9, 12, 19, 21, 25, 34], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 34, 35], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 26, 42], "new": [5, 6, 12, 19, 40], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 42], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 35, 42], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 32, 34], "mention": [5, 14], "previous": [5, 24, 25, 26], "safer": [5, 42], "dedic": [5, 6], "limit": [5, 6, 8, 10, 31, 34, 42], "privileg": [5, 6, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 35], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 7, 25], "laptop": 6, "45": 6, "10": [6, 10, 14, 16], "44": 6, "8": [6, 16, 19, 21, 25], "41": 6, "38": 6, "34": 6, "32": 6, "29": 6, "25": [6, 19], "18": 6, "avoid": [6, 14, 19, 31, 33, 42], "root": [6, 19, 22, 24, 25, 26], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 22, 24, 25, 26], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 30, 42], "higher": [6, 25, 30, 42], "wish": [6, 7], "match": [6, 42], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 34], "inform": [6, 7, 13, 14, 15, 17, 25, 27, 28, 29], "agent": [6, 7, 8, 9, 16, 19], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25, 26], "within": [6, 10, 14], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 39], "place": [6, 7, 8, 12, 14, 42], "outsid": [6, 7, 21], "result": [6, 7, 21, 28, 30, 31, 34, 40, 42], "lost": [6, 7, 14, 42], "exist": [6, 14, 42], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 34, 42], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25, 26], "2019": [6, 16, 39], "reach": [6, 8, 12, 30, 34, 36, 42], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 30, 31, 36, 38, 42], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 40], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 36, 41], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 29, 32, 35], "addit": [7, 8, 9, 10, 13, 15, 25, 42], "specif": [7, 10, 12, 17, 19, 37, 42], "driver": [7, 30, 31, 39, 42], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 41], "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 27, 28, 29, 30, 31, 36, 38, 42], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25, 26], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 35], "disk": [7, 10, 14, 19, 27, 29, 35], "possibl": [7, 10, 17, 33, 42], "api": [7, 8, 21], "resolv": 7, "explicitli": [7, 14], "ca": 7, "optim": [7, 32, 39, 43], "drop": [7, 41, 42], "while": [7, 19, 21, 22, 24, 25, 26, 34], "cdc": 7, "request": [7, 17, 35, 41], "how": [7, 8, 10, 14, 22, 24, 25, 26, 28, 29, 30, 35, 42], "someth": [7, 10, 11, 14, 25, 40], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 14, 19], "horizont": 8, "scale": [8, 41], "backup": 8, "benefit": [8, 42], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25, 26], "reason": [8, 14, 19, 25, 38, 42], "why": 8, "million": 8, "singl": [8, 14, 35], "capac": 8, "sometim": 8, "traffic": [8, 19, 39, 42], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 26, 29], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 35], "10903": 8, "10904": 8, "replica": [8, 28, 29, 30, 35, 36, 42], "abov": [8, 22, 24, 25, 26], "last": [8, 25], "db_address": 8, "could": [8, 35, 39, 41, 42], "long": [8, 10, 25, 40], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 42], "distribut": [9, 30, 39, 42], "email": [9, 10], "slack": [9, 10], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11, 35], "wrong": [10, 11, 14, 19, 25, 40, 42], "shown": [10, 19, 22, 24, 25, 26], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 33, 42], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 42], "let": [10, 21], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "sever": [10, 13, 15, 43], "annot": 10, "descript": [10, 35], "been": [10, 12], "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 42], "rout": [10, 30, 42], "repres": 10, "tree": 10, "win": [10, 19], "inhibit": 10, "mute": 10, "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 28], "simul": 10, "actual": [10, 38], "low": [10, 42], "space": 10, "lower": [10, 42], "fire": 10, "show": [10, 14, 16, 25, 42], "propag": 10, "valu": [10, 14, 32, 34, 40, 42], "similar": [10, 14], "free": 10, "big": [10, 42], "bisect": 10, "problem": [10, 35, 41, 42], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 35], "shard": [12, 19, 25, 35], "dd": 12, "non": [12, 19, 21, 29, 30, 35, 39, 42], "cost": [12, 42], "skip": [12, 25], "care": [12, 27, 28, 29, 42], "resembl": [12, 14], "filter": [12, 35], "perspect": 12, "graph": [12, 14, 21, 23, 25, 42], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "explain": [14, 22, 24, 25, 26, 35], "intern": [14, 30, 42], "potenti": [14, 35, 42], "issu": [14, 19, 35, 39, 42], "whenev": 14, "save": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 35], "maintain": 14, "too": [14, 34, 40], "verbos": 14, "element": [14, 35], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": [14, 25, 35, 36, 38], "fill": [14, 41], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 35], "nullpointmod": 14, "percentag": [14, 42], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 31, 42], "tooltip": 14, "msresolut": 14, "share": [14, 34], "sort": [14, 33, 42], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 42], "inherit": 14, "row": [14, 33, 42], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 37], "12": [14, 19, 25], "wa": [14, 42], "larger": 14, "break": [14, 31, 42], "later": 14, "were": [14, 21, 42], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 19, 23, 25], "calcul": [14, 19, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": [14, 35], "usual": [14, 19, 35, 42], "easier": 14, "wrapper": 14, "re": [14, 30], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2023": 16, "2018": [16, 31], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "56090": 19, "old": [19, 22, 23, 24, 25, 26], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 36], "post": 19, "past": [19, 23], "mai": [19, 34, 35, 36, 42], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 36], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 42], "align": 19, "On": [19, 35], "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 30, 42], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 27, 28, 29, 31, 36, 38, 42], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "dure": [19, 22, 24, 25, 26], "fallback": 19, "mechan": [19, 25, 28], "present": [19, 25], "newer": [19, 24, 25, 26], "reli": [19, 25, 42], "miss": [19, 25], "clean": 19, "recommend": [19, 22, 24, 25, 26], "increas": [19, 31, 34, 42], "might": [19, 40], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25, 26], "migrat": [21, 22, 24, 26], "lose": 21, "histor": [21, 25], "process": [21, 34, 41], "safe": 21, "page": [21, 23, 35], "unzip": [21, 22, 23, 24, 25, 26], "3001": [21, 22, 24, 25, 26], "9091": [21, 22, 24, 25, 26], "9094": 21, "fail": [21, 28, 30, 35, 42], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25, 26], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25, 26], "back": [21, 28], "uninstal": [22, 24, 25, 26], "minor": [22, 24, 25, 26], "9095": [22, 24, 25, 26], "brows": [22, 24, 25, 26], "satisfi": [22, 24, 25, 26], "shut": [22, 24, 25, 26], "caus": [22, 24, 25, 26, 30, 42], "blackout": [22, 24, 25, 26], "normal": [22, 24, 25, 26], "oper": [22, 24, 25, 26, 35, 42], "complet": [22, 24, 25, 26], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25, 26], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 27, 35, 42], "ensur": 25, "patch": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 29], "latenc": [25, 30, 34, 35, 42], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 42], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 28], "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 28, 29, 42], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 34, 41], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 41], "half": 25, "primari": [27, 42], "kei": [27, 33, 42], "scan": 27, "These": [27, 42], "kind": [27, 42], "bigger": 27, "replicationfactor": [28, 29], "piec": 28, "determin": [28, 29, 36, 42], "repli": [28, 29, 31, 36, 38, 42], "unavail": [28, 42], "client": [28, 31, 35, 42], "respond": 28, "accompani": 28, "deep": 28, "understand": 28, "acknowledg": 29, "coordin": [29, 30, 36, 38, 42], "hint": 29, "fact": 29, "yet": 29, "ideal": [30, 42], "resourc": [30, 33, 42], "replic": [30, 36, 38, 42], "prepar": [30, 35, 39], "statement": [30, 32, 35, 39], "balanc": [30, 34, 35, 42], "polici": 30, "cours": 30, "intro": 30, "recap": 30, "ring": [30, 42], "architectur": 30, "chunk": [31, 42], "overal": [31, 34, 42], "thu": 31, "www": [31, 39], "07": 31, "13": 31, "effici": [31, 42], "concret": 32, "thumb": 32, "alwai": 32, "favor": 32, "partit": [33, 35], "BY": [33, 42], "ineffici": [33, 42], "consum": 33, "doc": 33, "background": [34, 41], "much": [34, 42], "impact": [34, 35], "compaction_static_shar": 34, "50": 34, "indic": [34, 35, 40, 41, 42], "overli": 34, "slow": 34, "enforc": 34, "min_threshold": 34, "compaction_enforce_min_threshold": 34, "bucket": 34, "sstabl": 34, "stc": 34, "recogn": 35, "bad": 35, "practic": [35, 39], "solv": 35, "left": 35, "categori": [35, 42], "jump": 35, "warn": 35, "cell": 35, "model": [35, 39, 41, 42], "imbal": 35, "imbalanc": 35, "hot": 35, "bottleneck": [35, 39], "cach": 35, "hit": 35, "awar": 35, "order": [35, 42], "due": 35, "unsatisfi": 35, "faulti": 35, "evict": 35, "answer": [36, 38], "aka": 36, "factor": 36, "quorum": [36, 42], "hardwar": [37, 41], "occur": 37, "leav": 38, "risk": 38, "identifi": [38, 42], "evenli": 39, "across": 39, "becom": 39, "explan": 39, "08": 39, "field": 40, "being": 40, "defi": 40, "purpos": 40, "shed": 41, "repair": 41, "que": 41, "upper": 42, "gaug": 42, "inspect": 42, "zero": 42, "mislead": 42, "panel": 42, "holder": 42, "prevent": 42, "inject": 42, "did": 42, "compound": 42, "column": 42, "ks1": 42, "table_demo": 42, "text": 42, "int": 42, "desc": 42, "cat1": 42, "asc": 42, "overhead": 42, "thing": 42, "major": 42, "success": 42, "hurt": 42, "cl": 42, "expens": 42, "term": 42, "ONE": 42, "local_quorum": 42, "local_on": 42, "nearest": 42, "advisor": 43}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 13, 26], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 35, 43], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 35, 43], "us": [2, 5, 6, 8, 12, 14, 27, 28, 29, 33, 43], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25, 26], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25, 26], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25, 26], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 29, 35, 43], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 41], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 37], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 34], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 31, 39], "node": [6, 37], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": [6, 17], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25, 26], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 26, 35, 42], "all": [7, 22, 24, 25, 26, 28], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25, 26], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 27, 28, 29, 30, 31, 32, 33, 39, 42], "updat": 8, "high": 9, "level": [9, 19, 28, 29, 36, 42], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 12, 14], "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25, 26], "modifi": 14, "limit": 14, "consist": [14, 28, 29, 36, 42], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25, 26], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25, 26], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25, 26], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25, 26], "fail": [19, 36, 38], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 37], "sign": 19, "server": [19, 22, 24, 25, 26], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "latenc": 19, "graph": 19, "ar": [19, 30, 31, 32, 39], "empti": 19, "reduc": 19, "total": 19, "number": 19, "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25, 26], "latest": 21, "new": [21, 22, 23, 24, 25, 26], "4": [21, 25, 26], "move": [21, 22, 24, 25, 26], "old": 21, "b": 21, "rollback": [21, 22, 23, 24, 25, 26], "link": [21, 22, 23, 24, 25, 26, 29, 30, 31, 33, 39], "y": [22, 24, 25, 26], "": [22, 24, 25, 26], "i": [22, 24, 25, 26, 37], "run": [22, 24, 25, 26], "correct": [22, 24, 25, 26], "correctli": [22, 24, 26], "kill": [22, 24, 25, 26], "test": [24, 25, 26], "mode": [24, 25, 26], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "some": [27, 28, 29, 30, 31, 32, 33, 36, 38], "allow": [27, 42], "filter": [27, 42], "ani": 29, "univers": [29, 30], "token": [30, 42], "awar": [30, 42], "select": 31, "non": [31, 32], "page": [31, 42], "blog": [31, 39], "prepar": [32, 40, 42], "revers": [33, 42], "order": 33, "document": 33, "compact": 34, "take": 34, "lot": 34, "cpu": 34, "advisor": 35, "section": 35, "oper": [36, 38], "due": 36, "unsatisfi": 36, "o": 37, "can": 37, "indic": 37, "faulti": 37, "replica": 38, "side": 38, "cql": [39, 42], "balanc": 39, "among": 39, "shard": 39, "statement": [40, 42], "cach": 40, "evict": 40, "overload": 41, "optim": 42, "read": 42, "cross": 42, "dc": 42, "request": 42}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some queries use reverse order": [[33, "some-queries-use-reverse-order"]], "Documentation link": [[33, "documentation-link"]], "Scylla Monitoring Stack Advisor": [[35, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[35, "the-advisor-section"]], "Some queries are non-prepared": [[32, "some-queries-are-non-prepared"]], "Some queries are not token-aware": [[30, "some-queries-are-not-token-aware"]], "University link": [[30, "university-link"]], "Some operation failed due to unsatisfied consistency level": [[36, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "CQL queries are not balanced among shards": [[39, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[39, "blog-post-link"]], "Some operations failed on the replica side": [[38, "some-operations-failed-on-the-replica-side"]], "I/O Errors can indicate a node with a faulty disk": [[37, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Compaction takes lots of memory and CPU": [[34, "compaction-takes-lots-of-memory-and-cpu"]], "Some SELECT queries are non-paged": [[31, "some-select-queries-are-non-paged"]], "Blog-post Links": [[31, "blog-post-links"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Upgrade Procedure": [[22, "upgrade-procedure"], [26, "upgrade-procedure"], [23, "upgrade-procedure"], [25, "upgrade-procedure"], [21, "upgrade-procedure"], [24, "upgrade-procedure"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[22, "setting-the-server-s-files"], [26, "setting-the-server-s-files"], [25, "setting-the-server-s-files"], [24, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[22, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[22, "validate-the-version-installed-correctly"], [26, "validate-the-version-installed-correctly"], [24, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[22, "kill-all-containers"], [26, "kill-all-containers"], [25, "kill-all-containers"], [24, "kill-all-containers"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Related Links": [[22, "related-links"], [26, "related-links"], [23, "related-links"], [25, "related-links"], [21, "related-links"], [24, "related-links"]], "Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y": [[26, "upgrade-guide-scylladb-monitoring-4-x-to-scylladb-monitoring-4-y"]], "Install 4.y (The new version)": [[26, "install-4-y-the-new-version"], [25, "install-4-y-the-new-version"]], "Killing the new 4.y Monitoring stack in testing mode": [[26, "killing-the-new-4-y-monitoring-stack-in-testing-mode"], [25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Move to version 4.y (the new version)": [[26, "move-to-version-4-y-the-new-version"], [25, "move-to-version-4-y-the-new-version"]], "Rollback to version 4.x": [[26, "rollback-to-version-4-x"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[23, "install-the-new-monitoring-stack"], [21, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[23, "validate-the-upgrade"], [21, "validate-the-upgrade"]], "Rollback": [[23, "rollback"], [21, "rollback"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Migrating": [[25, "migrating"]], "Backup": [[25, "backup"]], "Rollback to version 3.x": [[25, "rollback-to-version-3-x"], [24, "rollback-to-version-3-x"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Some queries use Consistency Level: ALL": [[28, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Some queries use ALLOW FILTERING": [[27, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Some queries use Consistency Level: ANY": [[29, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[29, "link-to-scylla-university"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[19, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[17, "prometheus-api"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Prepared statements cache eviction": [[40, "prepared-statements-cache-eviction"]], "System Overload": [[41, "system-overload"]], "Using Scylla Monitoring Stack": [[43, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[42, "the-cql-optimization"]], "Prepared Statements": [[42, "prepared-statements"]], "Token Aware": [[42, "token-aware"]], "Paged Queries": [[42, "paged-queries"]], "Reversed CQL Reads": [[42, "reversed-cql-reads"]], "ALLOW FILTERING": [[42, "allow-filtering"]], "Consistency Level": [[42, "consistency-level"]], "Cross DC": [[42, "cross-dc"]], "Cross DC Consistency Level": [[42, "cross-dc-consistency-level"]], "Cross DC read requests": [[42, "cross-dc-read-requests"]], "ScyllaDB Monitoring Stack": [[9, "scylladb-monitoring-stack"], [1, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.4/sitemap.xml b/branch-4.4/sitemap.xml new file mode 100644 index 000000000..264052979 --- /dev/null +++ b/branch-4.4/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.4/troubleshooting/index.html b/branch-4.4/troubleshooting/index.html new file mode 100644 index 000000000..71988dd73 --- /dev/null +++ b/branch-4.4/troubleshooting/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Troubleshooting Guide for Scylla Monitoring Stack

                            +
                            +
                            +

                            Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/troubleshooting/monitor-troubleshoot.html b/branch-4.4/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..8c54822e4 --- /dev/null +++ b/branch-4.4/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,902 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Troubleshoot Scylla Monitoring Stack

                            +

                            This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                            +
                            +

                            Problem

                            +
                            +

                            Scylla-Manager 2.2 with Duplicate information

                            +

                            Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                            +
                              +
                            • For Manager server: from 56090 to 5090

                            • +
                            • For Manager Agent: from 56090 to 5090

                            • +
                            +

                            For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                            +

                            However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                            +

                            The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                            +

                            Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                            +
                            +
                            +

                            A Container Fails To Start

                            +

                            When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                            +
                            Wait for Prometheus container to start........Error: Prometheus container failed to start
                            +
                            +
                            +

                            Should this happen, check the Docker logs for more information.

                            +
                            docker logs aprom
                            +
                            +
                            +

                            Usually the reason for the failure is described in the logs.

                            +
                            +
                            +

                            Files And Directory Permissions

                            +
                            +

                            Note

                            +

                            Avoid running Docker containers as root.

                            +
                            +

                            The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                            +

                            If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                            +
                            +

                            Note

                            +

                            If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                            +
                            +

                            For example if your Prometheus data directory is /prom-data and you are using centos user

                            +
                            ls -la /|grep prom-data
                            +
                            +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                            +
                            +sudo chown -R centos:centos /prom-data
                            +
                            +ls -la /|grep prom-data
                            +
                            +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                            +
                            +
                            +
                            +
                            +

                            No Data Points

                            +

                            No data points on all data charts.

                            +
                            +

                            Solution

                            +

                            If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                            +
                              +
                            1. Login to the Prometheus console:

                            2. +
                            3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                            4. +
                            5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                            6. +
                            +
                            +
                              +
                            • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                            • +
                            • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                            • +
                            • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                            • +
                            +
                            +

                            For example:

                            +
                            ./start-all.sh -v 3.1
                            +
                            +
                            +

                            More on start-all.sh options.

                            +
                            +
                            +
                            +

                            Grafana Chart Shows Error (!) Sign

                            +

                            Run this procedure on the Scylla Monitoring Stack server.

                            +

                            If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                            +
                            +

                            Solution

                            +

                            On the Scylla Monitoring Stack server:

                            +
                              +
                            1. Check Prometheus is running using docker ps.

                            2. +
                            +
                              +
                            • If it is not running check the prometheus.yml for errors.

                            • +
                            +

                            For example:

                            +
                            CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                            +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                            +
                            +
                            +
                              +
                            • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                            • +
                            +
                            +
                            +
                            +

                            Grafana Shows Server Level Metrics, but not Scylla Metrics

                            +

                            Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                            +
                            +

                            Solution

                            +
                              +
                            • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                            • +
                            +

                            For example

                            +
                            curl 172.17.0.2:9180/metrics
                            +
                            +
                            +
                            +
                            +
                            +

                            Grafana Shows Scylla Metrics, but not Server Level Metrics

                            +

                            Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                            +
                            +

                            Solution

                            +

                            1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                            +
                              +
                            1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                            2. +
                            +
                            +
                            +

                            Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                            +

                            While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                            +

                            If the node_exporter service is not starting it may need to be updated manually.

                            +

                            Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                            +
                            +
                            +
                            +

                            Latencies Graphs Are empty

                            +

                            Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                            +

                            During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                            +

                            Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                            +

                            If only the latency graphs are missing, it is because of missing recording rules.

                            +

                            This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                            +

                            If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                            +
                            +
                            +

                            Reducing the total number of metrics

                            +

                            In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                            +
                            +

                            Remove interrupts from node_exporter

                            +

                            By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                            +
                            +
                            +
                            +

                            Working with Wireshark

                            +

                            No metrics shown in the Scylla Monitoring Stack.

                            +
                              +
                            1. Install wireshark

                            2. +
                            +

                            2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                            +

                            For example:

                            +
                            tshark -i eth0 -f "dst port 9180"
                            +
                            +
                            +

                            Capture from Scylla node towards Scylla Monitoring Stack server.

                            +

                            In this example, Scylla is running.

                            +
                            Monitor ip        Scylla node ip
                            +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                            +
                            +
                            +

                            In this example, Scylla is not running

                            +
                            Monitor ip        Scylla node ip
                            +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                            +
                            +
                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/index.html b/branch-4.4/upgrade/index.html new file mode 100644 index 000000000..fa1b76ee3 --- /dev/null +++ b/branch-4.4/upgrade/index.html @@ -0,0 +1,699 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Scylla Monitoring Stack

                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..e56c51ebf --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,810 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                            +

                            Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                            +
                            +

                            Upgrade Procedure

                            +
                            +

                            1. Upgrade to the latest 1.x version

                            +

                            Before starting the upgrade procedure, make sure you are running the latest 1.x version

                            +
                            +
                            +

                            2. Install the new monitoring stack

                            +
                              +
                            1. Download the 2.x version from the release page.

                            2. +
                            3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                            4. +
                            5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                              +
                                +
                              • scylla_servers.yml

                              • +
                              • scylla_manager_servers.yml

                              • +
                              • node_exporter_servers.yml

                              • +
                              +
                            6. +
                            7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                            8. +
                            +
                            ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                            +
                            +
                            +
                            +

                            Note

                            +

                            Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                            +
                            +

                            While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                            +
                            ./kill-all.sh -g 3001 -p 9091 -m 9094
                            +
                            +
                            +
                            +

                            Validation

                            +

                            Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                            +
                            +
                            +
                            +

                            3. Alerting Rules

                            +

                            Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                            +
                            +
                            +

                            4. Moving to Prometheus 2.x

                            +

                            Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                            +

                            Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                            +
                            +

                            a. Set the old system

                            +

                            The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                            +
                              +
                            • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                            • +
                            • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                            • +
                            +
                            +

                            Note

                            +

                            After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                            +
                            +
                            +
                            +

                            b. Set the new system

                            +

                            The following step will allow the new monitoring system to read historical metrics from the old system.

                            +
                              +
                            • In the Prometheus prometheus.yml.template file add the following at the end:

                            • +
                            +
                            remote_read:
                            +  - url: "http://{ip}:9111/api/v1/read"
                            +
                            +
                            +

                            Where {ip} is the ip of the old system.

                            +
                              +
                            • restart the new stack

                            • +
                            +
                            +
                            +
                            +

                            Validate the upgrade

                            +

                            You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                            +
                            +
                            +
                            +

                            Rollback

                            +

                            In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..69fc084d5 --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,804 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                            +
                            +

                            Upgrade Procedure

                            +

                            We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                            +

                            Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                            +
                            +

                            Install 2.y (The new version)

                            +
                            wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                            +unzip scylla-monitoring-2.y.zip
                            +cd scylla-monitoring-scylla-monitoring-2.y/
                            +
                            +
                            +

                            Replace “y” with the new minor release number, for example, 2.1.zip

                            +
                            +
                            +

                            Setting the server’s files

                            +

                            Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                            +
                            cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                            +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                            +
                            +
                            +
                            +
                            +

                            Validate the new version is running the correct version

                            +

                            Starting from Scylla-Monitoring version 2.2, you can run:

                            +
                            ./start-all.sh --version
                            +
                            +
                            +

                            To validate the Scylla-Monitoring version.

                            +
                            +
                            +

                            Validate the version installed correctly

                            +

                            To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                            +
                            ./start-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            Browse to http://{ip}:9091 +And check the Grafana dashboard

                            +

                            Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                            +
                            +

                            Caution

                            +

                            Important: do not use the local dir flag when testing!

                            +
                            +

                            When you are satisfied with the data in the dashboard, you can shut down the containers.

                            +
                            +

                            Caution

                            +

                            Important: Do not kill the 2.x version that is currently running.

                            +
                            +

                            Use the following command to kill the containers:

                            +
                            ./kill-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            You can start and stop the new 2.y version while testing.

                            +
                            +
                            +

                            Move to version 2.y (the new version)

                            +

                            Note: migrating will cause a few seconds of blackout in the system.

                            +

                            We assume that you are using external volume to store the metrics data.

                            +
                            +

                            Kill all containers

                            +

                            Follow the instruction on how to kill the 2.y version when in testing mode.

                            +

                            To kill the 2.x version containers, run:

                            +
                            ./kill-all.sh
                            +
                            +
                            +

                            Start version 2.y in normal mode

                            +

                            From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                            +
                            ./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +

                            Point your browser to http://{ip}:3000 and see that the data is there.

                            +
                            +
                            +
                            +

                            Rollback to version 2.x

                            +

                            To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                            +

                            To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                            +
                            ./kill-all.sh
                            +cd /path/to/scylla-grafana-2.x/
                            +./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +
                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..c13505649 --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,768 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                            +

                            Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                            +
                            +

                            Upgrade Procedure

                            +
                            +

                            1. Validate node_exporter version

                            +

                            Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                            +

                            If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                            +
                            +
                            +

                            2. Install the new monitoring stack

                            +
                              +
                            1. Download the 3.x version from the release page.

                            2. +
                            3. Unzip it into a different directory.

                            4. +
                            5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                              +
                                +
                              • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                              • +
                              • scylla_manager_servers.yml

                              • +
                              +
                              +
                              +

                              Note

                              +

                              The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                              +
                              +
                              +
                            6. +
                            7. Stop the old monitoring stack

                              +
                              +
                              ./kill-all.sh
                              +
                              +
                              +
                              +
                            8. +
                            9. Start the new monitoring stack

                              +
                              +
                              ./start-all.sh -d /prometheus-data-path
                              +
                              +
                              +
                              +
                            10. +
                            +
                            +
                            +

                            Validate the upgrade

                            +

                            You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                            +

                            Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                            +
                            +
                            +
                            +

                            Rollback

                            +

                            To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..4995e6eb2 --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,812 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                            +
                            +

                            Upgrade Procedure

                            +

                            We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                            +

                            Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                            +
                            +

                            Install 3.y (The new version)

                            +
                            wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                            +unzip scylla-monitoring-3.y.zip
                            +cd scylla-monitoring-scylla-monitoring-3.y/
                            +
                            +
                            +

                            Replace “y” with the new minor release number, for example, 3.0.1.zip

                            +
                            +
                            +

                            Setting the server’s files

                            +

                            Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                            +
                            cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                            +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                            +
                            +
                            +
                            +
                            +

                            Validate the new version is running the correct version

                            +

                            Starting from Scylla-Monitoring version 2.2, you can run:

                            +
                            ./start-all.sh --version
                            +
                            +
                            +

                            To validate the Scylla-Monitoring version.

                            +
                            +
                            +

                            Validate the version installed correctly

                            +

                            To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                            +
                            ./start-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            Browse to http://{ip}:9091 +And check the Grafana dashboard

                            +

                            Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                            +
                            +

                            Caution

                            +

                            Important: do not use the local dir flag when testing!

                            +
                            +

                            When you are satisfied with the data in the dashboard, you can shut down the containers.

                            +
                            +

                            Caution

                            +

                            Important: Do not kill the 3.x version that is currently running.

                            +
                            +
                            +
                            +

                            Killing the new 3.y Monitoring stack in testing mode

                            +

                            Use the following command to kill the containers:

                            +
                            ./kill-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            You can start and stop the new 3.y version while testing.

                            +
                            +
                            +

                            Move to version 3.y (the new version)

                            +

                            Note: migrating will cause a few seconds of blackout in the system.

                            +

                            We assume that you are using external volume to store the metrics data.

                            +
                            +

                            Kill all containers

                            +

                            At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                            +

                            Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                            +

                            kill the older 3.x version containers by running:

                            +
                            ./kill-all.sh
                            +
                            +
                            +

                            Start version 3.y in normal mode

                            +

                            From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                            +
                            ./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +

                            Point your browser to http://{ip}:3000 and see that the data is there.

                            +
                            +
                            +
                            +

                            Rollback to version 3.x

                            +

                            To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                            +

                            To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                            +
                            ./kill-all.sh
                            +cd /path/to/scylla-grafana-3.x/
                            +./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +
                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..03eca8071 --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,955 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                            +
                            +

                            Upgrade Procedure

                            +

                            We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                            +

                            Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                            +
                            +

                            Install 4.y (The new version)

                            +
                            wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                            +unzip scylla-monitoring-4.y.zip
                            +cd scylla-monitoring-scylla-monitoring-4.y/
                            +
                            +
                            +

                            Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                            +
                            +
                            +

                            Setting the server’s files

                            +

                            Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                            +
                            cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                            +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                            +
                            +
                            +
                            +
                            +

                            Validate the new version is running the correct version

                            +

                            run:

                            +
                            ./start-all.sh --version
                            +
                            +
                            +

                            To validate the Scylla-Monitoring version.

                            +
                            +
                            +
                            +

                            Running in test mode

                            +

                            This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                            +
                            +

                            Running second monitoring stack

                            +

                            We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                            +
                            ./start-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            Browse to http://{ip}:9091 and check the Grafana dashboard.

                            +

                            Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                            +
                            +

                            Caution

                            +

                            Important: do not use the local dir flag when testing!

                            +
                            +

                            When you are satisfied with the data in the dashboard, you can shut down the containers.

                            +
                            +

                            Caution

                            +

                            Important: Do not kill the 3.x version that is currently running!

                            +
                            +
                            +
                            +

                            Killing the new 4.y Monitoring stack in testing mode

                            +

                            Use the following command to kill the containers:

                            +
                            ./kill-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            You can start and stop the new 4.y version while testing.

                            +
                            +
                            +
                            +

                            Migrating

                            +
                            +

                            Move to version 4.y (the new version)

                            +

                            Note: migrating will cause a few seconds of blackout in the system.

                            +

                            We assume that you are using external volume to store the metrics data.

                            +
                            +

                            Backup

                            +

                            We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                            +
                            +
                            +

                            Kill all containers

                            +

                            At this point you have two monitoring stacks installed with the older version running.

                            +

                            If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                            +

                            kill the older 3.x version containers by running:

                            +
                            ./kill-all.sh
                            +
                            +
                            +

                            Start version 4.y in normal mode

                            +

                            From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                            +
                            ./start-all.sh -d /path/to/copy/data/dir
                            +
                            +
                            +

                            Point your browser to http://{ip}:3000 and see that the data is there.

                            +
                            +
                            +
                            +

                            Rollback to version 3.x

                            +

                            To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                            +

                            To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                            +
                            ./kill-all.sh
                            +cd /path/to/scylla-grafana-3.x/
                            +./start-all.sh -d /path/to/original/data/dir
                            +
                            +
                            +
                            +
                            +
                            +

                            Post-installation: Metrics back-filling

                            +

                            Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                            +

                            For example, this is a recording rule that calculates the p99 write latency:

                            +
                            - record: wlatencyp99
                            +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                            +  labels:
                            +    by: "instance,shard"
                            +
                            +
                            +

                            For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                            +

                            Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                            +
                            +
                            +

                            Note

                            +

                            If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                            +
                            +
                            +
                            +../_images/before-backfilling.png +
                            +

                            This is an example of missing latency graph

                            +
                            +
                            +

                            The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                            +

                            For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                            +

                            In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                            +

                            The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                            +
                            +

                            Determine the backfilling period

                            +

                            When you run the backfilling process you need to determine the start time and end time.

                            +
                            +

                            Determine the start time

                            +

                            The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                            +

                            If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                            +

                            For the rest of this example, we will assume that your retention time is 360 days.

                            +
                            +
                            +

                            Determine the end time

                            +

                            Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                            +

                            If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                            +

                            That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                            +

                            The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                            +
                            +
                            +
                            +

                            Backfilling Process

                            +
                            +

                            backup

                            +

                            If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                            +

                            To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                            +
                            +
                            +

                            Restart the monitoring stack

                            +

                            You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                            +

                            -b "--storage.tsdb.allow-overlapping-blocks"

                            +
                            +
                            +

                            Create the data files

                            +

                            We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                            +

                            The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                            +

                            Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                            +
                            docker exec -it aprom sh
                            +cd /prometheus/data/
                            +promtool tsdb create-blocks-from rules \
                            +--start $start \
                            +--end $end \
                            +--url http://localhost:9090 \
                            +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                            +
                            +
                            +

                            It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                            +
                            +
                            +

                            Note

                            +

                            Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                            +
                            +
                            +
                            +
                            +

                            Copy the data files

                            +

                            Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                            +

                            Copy the data files to the Prometheus directory:

                            +
                            cp data/* .
                            +
                            +
                            +

                            The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                            +

                            Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                            +
                            +../_images/after-backfilling.jpg +
                            +

                            Un example: after loading half of the data

                            +
                            +
                            +
                            +
                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..73c718c54 --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,813 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x to 4.y, for example, between 4.0 to 4.0.1.

                            +
                            +

                            Upgrade Procedure

                            +

                            We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                            +

                            Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                            +
                            +

                            Install 4.y (The new version)

                            +
                            wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                            +unzip scylla-monitoring-4.y.zip
                            +cd scylla-monitoring-scylla-monitoring-4.y/
                            +
                            +
                            +

                            Replace “y” with the new minor release number, for example, 4.0.1.zip

                            +
                            +
                            +

                            Setting the server’s files

                            +

                            Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                            +
                            cp /path/to/monitoring/4.x/prometheus/scylla_servers.yml prometheus/
                            +cp /path/to/monitoring/4.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                            +
                            +
                            +
                            +
                            +

                            Validate the new version is running the correct version

                            +

                            Run:

                            +
                            ./start-all.sh --version
                            +
                            +
                            +

                            To validate the Scylla-Monitoring version.

                            +
                            +
                            +

                            Validate the version installed correctly

                            +

                            To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x) stack.

                            +
                            ./start-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            Browse to http://{ip}:9091 +And check the Grafana dashboard

                            +

                            Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                            +
                            +

                            Caution

                            +

                            Important: do not use the local dir flag when testing!

                            +
                            +

                            When you are satisfied with the data in the dashboard, you can shut down the containers.

                            +
                            +

                            Caution

                            +

                            Important: Do not kill the 4.x version that is currently running.

                            +
                            +
                            +
                            +

                            Killing the new 4.y Monitoring stack in testing mode

                            +

                            Use the following command to kill the containers:

                            +
                            ./kill-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            You can start and stop the new 4.y version while testing.

                            +
                            +
                            +

                            Move to version 4.y (the new version)

                            +

                            Note: migrating will cause a few seconds of blackout in the system.

                            +

                            We assume that you are using external volume to store the metrics data.

                            +
                            +

                            Kill all containers

                            +

                            At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                            +

                            Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section

                            +

                            kill the older 4.x version containers by running:

                            +
                            ./kill-all.sh
                            +
                            +
                            +

                            Start version 4.y in normal mode

                            +

                            From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                            +
                            ./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +

                            Point your browser to http://{ip}:3000 and see that the data is there.

                            +
                            +
                            +
                            +

                            Rollback to version 4.x

                            +

                            To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                            +

                            To rollback to version 4.x after you completed the moving to version 4.y (as shown above). +Run:

                            +
                            ./kill-all.sh
                            +cd /path/to/scylla-grafana-4.x/
                            +./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +
                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.4/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..302859c8e --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries use ALLOW FILTERING

                            +

                            Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                            +

                            These kinds of queries can create a bigger load on Scylla, and should be used with care.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlCLAll.html b/branch-4.4/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..2b4e7066d --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries use Consistency Level: ALL

                            +

                            Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                            +

                            Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                            +

                            Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlCLAny.html b/branch-4.4/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..f4286bc9b --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries use Consistency Level: ANY

                            +

                            Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                            +

                            Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.4/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..95770a997 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries are not token-aware

                            +

                            Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                            +

                            Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlNonPaged.html b/branch-4.4/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..37a57b107 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some SELECT queries are non-paged

                            +

                            By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                            +
                            +

                            Blog-post Links

                            +

                            https://www.scylladb.com/2018/07/13/efficient-query-paging/

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.4/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..f4591fffd --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries are non-prepared

                            +

                            Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlReverseOrder.html b/branch-4.4/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..2fad0c597 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries use reverse order

                            +

                            Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                            +

                            Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/heavyCompaction.html b/branch-4.4/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..ab74dc902 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Compaction takes lots of memory and CPU

                            +

                            ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                            +

                            If this is the case, you can do one of the following:

                            +
                              +
                            • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                              +
                              +
                                +
                              • In the scylla.yml configuration file: compaction_static_shares: 100

                              • +
                              • In the command line when starting ScyllaDB: --compaction-static-shares 100

                              • +
                              +
                              +

                              You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                              +
                            • +
                            • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                            • +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/index.html b/branch-4.4/use-monitoring/advisor/index.html new file mode 100644 index 000000000..8b7bbaa84 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/index.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Stack Advisor

                            +
                            +
                            +

                            The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                            +
                            +

                            The Advisor section

                            +
                            +../../_images/advisor_panel.png +
                            +

                            The Advisor section

                            +
                            +
                            +

                            The Advisor section is located on the Overview dashboard and consists of two parts:

                            +

                            On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                            +

                            For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                            +

                            On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                            +

                            For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                            +

                            Each Advisor issue is explained in detail:

                            + +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/nodeCLErrors.html b/branch-4.4/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..f887e3266 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Some operation failed due to unsatisfied consistency level

                            +

                            ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                            +

                            For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                            +

                            When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/nodeIOErrors.html b/branch-4.4/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..aa85efc5a --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            I/O Errors can indicate a node with a faulty disk

                            +

                            I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.4/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..d7b220f52 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Some operations failed on the replica side

                            +

                            ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                            +

                            An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.4/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..a9c86a75e --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            CQL queries are not balanced among shards

                            +

                            For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                            +

                            There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                            +
                            +

                            Blog post link

                            +

                            https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.4/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..3a53fef08 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Prepared statements cache eviction

                            +

                            Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                            +
                              +
                            • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                            • +
                            • The prepared statements cache might be too small for the number of prepared statements.

                            • +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/systemOverload.html b/branch-4.4/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..a02db6ab9 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            System Overload

                            +

                            There could be multiple indications that a system is overloaded:

                            +
                              +
                            • Timeouts

                            • +
                            • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                            • +
                            • CPU at 100% when no background process (like compaction or repair) runs.

                            • +
                            • Ques are getting filled.

                            • +
                            +

                            If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/cql-optimization.html b/branch-4.4/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..db237bf02 --- /dev/null +++ b/branch-4.4/use-monitoring/cql-optimization.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            The CQL Optimization

                            +

                            The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                            +
                            +../_images/cql_optimization_master.png +
                            +

                            The CQL Dashboard

                            +
                            +
                            +

                            The upper part of the dashboard holds CQL related metrics.

                            +

                            The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                            +
                            +

                            Note

                            +

                            Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                            +
                            +

                            The following sections describe each of the dashboard’s panel

                            +
                            +

                            Prepared Statements

                            +

                            Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                            +

                            Using prepared statements has the following benefits:

                            +
                              +
                            • The database only needs to parse the query once

                            • +
                            • The driver can route the query to the right node

                            • +
                            • Using place-holders and values is safer and prevents CQL-Injection

                            • +
                            +

                            The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                            +

                            The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                            +
                            +
                            +

                            Token Aware

                            +

                            Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                            +

                            Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                            +

                            The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                            +

                            The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                            +
                            +
                            +

                            Paged Queries

                            +

                            By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                            +

                            The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                            +

                            The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                            +
                            +
                            +

                            Reversed CQL Reads

                            +

                            Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                            +

                            Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                            +

                            For example, look at the following table:

                            +
                            CREATE TABLE ks1.table_demo (
                            +   category text,
                            +   type int,
                            +   PRIMARY KEY (category, type))
                            +WITH CLUSTERING ORDER BY (type DESC);
                            +
                            +
                            +

                            The following query uses reverse order:

                            +
                            select * from ks1.table_demo where category='cat1' order by type ASC;
                            +
                            +
                            +

                            The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                            +

                            The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                            +
                            +
                            +

                            ALLOW FILTERING

                            +

                            Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                            +

                            These kinds of queries can create a big load on the system, and should be used with care.

                            +

                            The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                            +

                            The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                            +

                            The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                            +

                            The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                            +

                            The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                            +
                            +
                            +

                            Consistency Level

                            +

                            Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                            +

                            The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                            +

                            Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                            +

                            The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                            +

                            The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                            +

                            The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                            +

                            The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                            +
                            +
                            +

                            Cross DC

                            +

                            Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                            +
                            +
                            +

                            Cross DC Consistency Level

                            +

                            Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                            +
                            +
                            +

                            Cross DC read requests

                            +
                            +

                            Note

                            +

                            The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                            +
                            +

                            In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                            +

                            The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/index.html b/branch-4.4/use-monitoring/index.html new file mode 100644 index 000000000..704dedc81 --- /dev/null +++ b/branch-4.4/use-monitoring/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Using Scylla Monitoring Stack

                            +
                            +
                            +

                            There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.5/.buildinfo b/branch-4.5/.buildinfo new file mode 100644 index 000000000..345995c57 --- /dev/null +++ b/branch-4.5/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 66fd7a0e40c33289db4a55ea77963d4a +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.5/.doctrees/common/monitor-description.doctree b/branch-4.5/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..7b6114703 Binary files /dev/null and b/branch-4.5/.doctrees/common/monitor-description.doctree differ diff --git a/branch-4.5/.doctrees/environment.pickle b/branch-4.5/.doctrees/environment.pickle new file mode 100644 index 000000000..34f44dc74 Binary files /dev/null and b/branch-4.5/.doctrees/environment.pickle differ diff --git a/branch-4.5/.doctrees/index.doctree b/branch-4.5/.doctrees/index.doctree new file mode 100644 index 000000000..9157c2b51 Binary files /dev/null and b/branch-4.5/.doctrees/index.doctree differ diff --git a/branch-4.5/.doctrees/install/docker-compose.doctree b/branch-4.5/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..4ca0c642e Binary files /dev/null and b/branch-4.5/.doctrees/install/docker-compose.doctree differ diff --git a/branch-4.5/.doctrees/install/index.doctree b/branch-4.5/.doctrees/install/index.doctree new file mode 100644 index 000000000..45d2d9975 Binary files /dev/null and b/branch-4.5/.doctrees/install/index.doctree differ diff --git a/branch-4.5/.doctrees/install/min-prod-hw.doctree b/branch-4.5/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..859673c5e Binary files /dev/null and b/branch-4.5/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.5/.doctrees/install/monitor-without-docker.doctree b/branch-4.5/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..deb7f9252 Binary files /dev/null and b/branch-4.5/.doctrees/install/monitor-without-docker.doctree differ diff --git a/branch-4.5/.doctrees/install/monitoring-stack.doctree b/branch-4.5/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..40a9e88fa Binary files /dev/null and b/branch-4.5/.doctrees/install/monitoring-stack.doctree differ diff --git a/branch-4.5/.doctrees/install/start-all.doctree b/branch-4.5/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..c97a3f3cc Binary files /dev/null and b/branch-4.5/.doctrees/install/start-all.doctree differ diff --git a/branch-4.5/.doctrees/install/thanos.doctree b/branch-4.5/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..bdb2db3d8 Binary files /dev/null and b/branch-4.5/.doctrees/install/thanos.doctree differ diff --git a/branch-4.5/.doctrees/intro.doctree b/branch-4.5/.doctrees/intro.doctree new file mode 100644 index 000000000..50f15c769 Binary files /dev/null and b/branch-4.5/.doctrees/intro.doctree differ diff --git a/branch-4.5/.doctrees/procedures/alerts/alerting.doctree b/branch-4.5/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..dc87c569a Binary files /dev/null and b/branch-4.5/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.5/.doctrees/procedures/alerts/index.doctree b/branch-4.5/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..b5b9d52b4 Binary files /dev/null and b/branch-4.5/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.5/.doctrees/procedures/datadog/index.doctree b/branch-4.5/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..57ec010c7 Binary files /dev/null and b/branch-4.5/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.5/.doctrees/procedures/index.doctree b/branch-4.5/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..749f2296a Binary files /dev/null and b/branch-4.5/.doctrees/procedures/index.doctree differ diff --git a/branch-4.5/.doctrees/procedures/updating-dashboard.doctree b/branch-4.5/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..1e17f768a Binary files /dev/null and b/branch-4.5/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/branch-4.5/.doctrees/reference/index.doctree b/branch-4.5/.doctrees/reference/index.doctree new file mode 100644 index 000000000..16918627e Binary files /dev/null and b/branch-4.5/.doctrees/reference/index.doctree differ diff --git a/branch-4.5/.doctrees/reference/matrix.doctree b/branch-4.5/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..71a55d4a8 Binary files /dev/null and b/branch-4.5/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.5/.doctrees/reference/monitoring-apis.doctree b/branch-4.5/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..35cbbb281 Binary files /dev/null and b/branch-4.5/.doctrees/reference/monitoring-apis.doctree differ diff --git a/branch-4.5/.doctrees/troubleshooting/index.doctree b/branch-4.5/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..59cc71761 Binary files /dev/null and b/branch-4.5/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.5/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/branch-4.5/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..7fa3dd83c Binary files /dev/null and b/branch-4.5/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/index.doctree b/branch-4.5/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..3ced679c8 Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..707680df3 Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..e8842bf48 Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..4a541a7b5 Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..a61eaf310 Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..07453062f Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..166fcbfa6 Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..687eebdbb Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..78fbca5fe Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..cf65939dd Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..a22639708 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..4e9f7a8d6 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..4710426ad Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..9bdff1330 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..c4ea240d0 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..c1c0cf81e Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..f0bf1a20c Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..5e5454148 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..bccc1b566 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..8f153f1c4 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..375ac629f Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/cql-optimization.doctree b/branch-4.5/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..820ef9532 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/index.doctree b/branch-4.5/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..2614112bb Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.5/.nojekyll b/branch-4.5/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.5/404.html b/branch-4.5/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.5/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                            +

                            404

                            +

                            The ScyllaDB monster ate your page!

                            +

                            + Home +

                            +
                            + + + \ No newline at end of file diff --git a/branch-4.5/CNAME b/branch-4.5/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.5/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.5/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.5/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..3e85b60ab --- /dev/null +++ b/branch-4.5/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,576 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" diff --git a/branch-4.5/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.5/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.5/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.5/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.5/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/branch-4.5/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.5/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.5/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/branch-4.5/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.5/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/branch-4.5/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/branch-4.5/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/branch-4.5/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.5/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/branch-4.5/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.5/_images/1.png b/branch-4.5/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.5/_images/1.png differ diff --git a/branch-4.5/_images/2.png b/branch-4.5/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.5/_images/2.png differ diff --git a/branch-4.5/_images/3.png b/branch-4.5/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.5/_images/3.png differ diff --git a/branch-4.5/_images/advisor_panel.png b/branch-4.5/_images/advisor_panel.png new file mode 100644 index 000000000..89b9a5950 Binary files /dev/null and b/branch-4.5/_images/advisor_panel.png differ diff --git a/branch-4.5/_images/after-backfilling.jpg b/branch-4.5/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.5/_images/after-backfilling.jpg differ diff --git a/branch-4.5/_images/alertmanager.png b/branch-4.5/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.5/_images/alertmanager.png differ diff --git a/branch-4.5/_images/before-backfilling.png b/branch-4.5/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.5/_images/before-backfilling.png differ diff --git a/branch-4.5/_images/cql_optimization_master.png b/branch-4.5/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.5/_images/cql_optimization_master.png differ diff --git a/branch-4.5/_images/datadog.png b/branch-4.5/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.5/_images/datadog.png differ diff --git a/branch-4.5/_images/grafana.png b/branch-4.5/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.5/_images/grafana.png differ diff --git a/branch-4.5/_images/monitor.png b/branch-4.5/_images/monitor.png new file mode 100644 index 000000000..cf691ecb3 Binary files /dev/null and b/branch-4.5/_images/monitor.png differ diff --git a/branch-4.5/_images/monitoring_stack.png b/branch-4.5/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.5/_images/monitoring_stack.png differ diff --git a/branch-4.5/_images/monitoring_stack1.png b/branch-4.5/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.5/_images/monitoring_stack1.png differ diff --git a/branch-4.5/_sources/common/monitor-description.rst.txt b/branch-4.5/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.5/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.5/_sources/index.rst.txt b/branch-4.5/_sources/index.rst.txt new file mode 100644 index 000000000..3dbe94edd --- /dev/null +++ b/branch-4.5/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.5/_sources/install/docker-compose.rst.txt b/branch-4.5/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.5/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.5/_sources/install/index.rst.txt b/branch-4.5/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/branch-4.5/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.5/_sources/install/min-prod-hw.rst.txt b/branch-4.5/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/branch-4.5/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                            + + + + + + + + + + + +
                            # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                            00
                            + +
                            + \ No newline at end of file diff --git a/branch-4.5/_sources/install/monitor-without-docker.rst.txt b/branch-4.5/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..d0be59164 --- /dev/null +++ b/branch-4.5/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                            `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.5/_sources/install/monitoring-stack.rst.txt b/branch-4.5/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..0640b50c8 --- /dev/null +++ b/branch-4.5/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,409 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                            `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.5 + - 2.47.1 + - 10.1.5 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.5/_sources/install/start-all.rst.txt b/branch-4.5/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..4407b5495 --- /dev/null +++ b/branch-4.5/_sources/install/start-all.rst.txt @@ -0,0 +1,105 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.5/_sources/install/thanos.rst.txt b/branch-4.5/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.5/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.5/_sources/intro.rst.txt b/branch-4.5/_sources/intro.rst.txt new file mode 100644 index 000000000..78481f6c3 --- /dev/null +++ b/branch-4.5/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.5/_sources/procedures/alerts/alerting.rst.txt b/branch-4.5/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.5/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.5/_sources/procedures/alerts/index.rst.txt b/branch-4.5/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.5/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.5/_sources/procedures/datadog/index.rst.txt b/branch-4.5/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bcc4e9b7 --- /dev/null +++ b/branch-4.5/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,68 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Non Scylla Cloud users, download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Cloud users, skip this step, it's been take care for by the cloud. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.5/_sources/procedures/index.rst.txt b/branch-4.5/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..76a24002a --- /dev/null +++ b/branch-4.5/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.5/_sources/procedures/updating-dashboard.rst.txt b/branch-4.5/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.5/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.5/_sources/reference/index.rst.txt b/branch-4.5/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/branch-4.5/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.5/_sources/reference/matrix.rst.txt b/branch-4.5/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..23cb1efa2 --- /dev/null +++ b/branch-4.5/_sources/reference/matrix.rst.txt @@ -0,0 +1,155 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.5/_sources/reference/monitoring-apis.rst.txt b/branch-4.5/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/branch-4.5/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.5/_sources/troubleshooting/index.rst.txt b/branch-4.5/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..fa1b25a10 --- /dev/null +++ b/branch-4.5/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,16 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* You can ask questions and discuss the ScyllaDB Monitoring Stack in the `ScyllaDB community forum `_ and on the `Slack channel `_. \ No newline at end of file diff --git a/branch-4.5/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/branch-4.5/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/branch-4.5/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.5/_sources/upgrade/index.rst.txt b/branch-4.5/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/branch-4.5/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                            +
                            +
                            +
                            Upgrade Scylla Open Source
                            +
                            +
                            + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                            +
                            +
                            diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..71dbb9dbc --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,138 @@ +================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y +================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x to 4.y, for example, between 4.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x version that is currently running. + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x after you completed the moving to version 4.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..f86568a31 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,11 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.5/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.5/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..06fc98c5f --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,37 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.5/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.5/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.5/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.5/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.5/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.5/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.5/_sources/use-monitoring/cql-optimization.rst.txt b/branch-4.5/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..7ac8b2284 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,155 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +We strongly recommend using use the correct ordering. +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is supported, but not advisable. + + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.5/_sources/use-monitoring/index.rst.txt b/branch-4.5/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.5/_static/basic.css b/branch-4.5/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.5/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.5/_static/check-solid.svg b/branch-4.5/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.5/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.5/_static/clipboard.min.js b/branch-4.5/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.5/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.5/_static/copybutton.css b/branch-4.5/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.5/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                            Short

                            + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.5/_static/copybutton.js b/branch-4.5/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.5/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.5/_static/copybutton_funcs.js b/branch-4.5/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.5/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.5/_static/css/main.css b/branch-4.5/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-4.5/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.5/_static/doctools.js b/branch-4.5/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.5/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.5/_static/documentation_options.js b/branch-4.5/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.5/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.5/_static/file.png b/branch-4.5/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.5/_static/file.png differ diff --git a/branch-4.5/_static/img/banner-background.svg b/branch-4.5/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.5/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.5/_static/img/favicon-228x228.png b/branch-4.5/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.5/_static/img/favicon-228x228.png differ diff --git a/branch-4.5/_static/img/favicon-32x32.png b/branch-4.5/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.5/_static/img/favicon-32x32.png differ diff --git a/branch-4.5/_static/img/favicon.ico b/branch-4.5/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.5/_static/img/favicon.ico differ diff --git a/branch-4.5/_static/img/icons/icon-about-team.svg b/branch-4.5/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.5/_static/img/icons/icon-about-us-m.svg b/branch-4.5/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-about-us.svg b/branch-4.5/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-alternator.svg b/branch-4.5/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-apps.svg b/branch-4.5/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-architecture.svg b/branch-4.5/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.5/_static/img/icons/icon-benchmarks.svg b/branch-4.5/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.5/_static/img/icons/icon-blog.svg b/branch-4.5/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.5/_static/img/icons/icon-careers.svg b/branch-4.5/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.5/_static/img/icons/icon-chevron-left.svg b/branch-4.5/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.5/_static/img/icons/icon-chevron-right.svg b/branch-4.5/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.5/_static/img/icons/icon-circe.svg b/branch-4.5/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-clock.svg b/branch-4.5/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-close.svg b/branch-4.5/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-cloud-docs.svg b/branch-4.5/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-cloud.svg b/branch-4.5/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-comparison.svg b/branch-4.5/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.5/_static/img/icons/icon-contact-us.svg b/branch-4.5/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.5/_static/img/icons/icon-developers-blog.svg b/branch-4.5/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.5/_static/img/icons/icon-docs.svg b/branch-4.5/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.5/_static/img/icons/icon-enterprise-m.svg b/branch-4.5/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-enterprise.svg b/branch-4.5/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-events.svg b/branch-4.5/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.5/_static/img/icons/icon-exclamation.svg b/branch-4.5/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-expand.svg b/branch-4.5/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-forum.svg b/branch-4.5/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-getting-started.svg b/branch-4.5/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-glossary.svg b/branch-4.5/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-home.svg b/branch-4.5/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-infoworld.svg b/branch-4.5/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.5/_static/img/icons/icon-integrations.svg b/branch-4.5/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-knowledge-base.svg b/branch-4.5/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-less.svg b/branch-4.5/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-live-test.svg b/branch-4.5/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.5/_static/img/icons/icon-mail-list.svg b/branch-4.5/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-manager.svg b/branch-4.5/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.5/_static/img/icons/icon-memory-management.svg b/branch-4.5/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.5/_static/img/icons/icon-modeling.svg b/branch-4.5/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-monitoring.svg b/branch-4.5/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.5/_static/img/icons/icon-networking.svg b/branch-4.5/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.5/_static/img/icons/icon-news.svg b/branch-4.5/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.5/_static/img/icons/icon-newsletter.svg b/branch-4.5/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.5/_static/img/icons/icon-nsql-guides.svg b/branch-4.5/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.5/_static/img/icons/icon-open-source.svg b/branch-4.5/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.5/_static/img/icons/icon-operator.svg b/branch-4.5/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-overview.svg b/branch-4.5/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.5/_static/img/icons/icon-partners.svg b/branch-4.5/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.5/_static/img/icons/icon-plus.svg b/branch-4.5/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-pricing.svg b/branch-4.5/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.5/_static/img/icons/icon-release-notes.svg b/branch-4.5/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.5/_static/img/icons/icon-resource-center.svg b/branch-4.5/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.5/_static/img/icons/icon-roadmap.svg b/branch-4.5/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.5/_static/img/icons/icon-search.svg b/branch-4.5/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.5/_static/img/icons/icon-slack.svg b/branch-4.5/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-stack-overflow.svg b/branch-4.5/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.5/_static/img/icons/icon-summit.svg b/branch-4.5/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-support.svg b/branch-4.5/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.5/_static/img/icons/icon-tech-talks.svg b/branch-4.5/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.5/_static/img/icons/icon-testing.svg b/branch-4.5/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.5/_static/img/icons/icon-thumbs-down.svg b/branch-4.5/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-thumbs-up.svg b/branch-4.5/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-tip.svg b/branch-4.5/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.5/_static/img/icons/icon-training.svg b/branch-4.5/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.5/_static/img/icons/icon-triangle-down.svg b/branch-4.5/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.5/_static/img/icons/icon-university.svg b/branch-4.5/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.5/_static/img/icons/icon-users-blog.svg b/branch-4.5/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.5/_static/img/icons/icon-warning.svg b/branch-4.5/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-webinars.svg b/branch-4.5/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.5/_static/img/icons/icon-whitepapers.svg b/branch-4.5/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.5/_static/img/icons/icon-workshop.svg b/branch-4.5/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/logo-docs.svg b/branch-4.5/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.5/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.5/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.5/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.5/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.5/_static/img/mascots/404.jpg b/branch-4.5/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.5/_static/img/mascots/404.jpg differ diff --git a/branch-4.5/_static/img/mascots/scylla-3monsters.png b/branch-4.5/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.5/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-alternator.svg b/branch-4.5/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.5/_static/img/mascots/scylla-cloud.svg b/branch-4.5/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.5/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.5/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-computer-headset.png b/branch-4.5/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-cup-number-one.png b/branch-4.5/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-docs.svg b/branch-4.5/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.5/_static/img/mascots/scylla-drivers.svg b/branch-4.5/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.5/_static/img/mascots/scylla-enterprise.svg b/branch-4.5/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.5/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.5/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-forklift-migration.png b/branch-4.5/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-gear.png b/branch-4.5/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-hardhat.png b/branch-4.5/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-headband.png b/branch-4.5/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-headset.png b/branch-4.5/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-hearts.png b/branch-4.5/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-looking-down.png b/branch-4.5/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-looking-up.png b/branch-4.5/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.5/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.5/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-manager.svg b/branch-4.5/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.5/_static/img/mascots/scylla-monitor.svg b/branch-4.5/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.5/_static/img/mascots/scylla-movement-fast.png b/branch-4.5/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-movement.png b/branch-4.5/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-onpremise.png b/branch-4.5/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-opensource.svg b/branch-4.5/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.5/_static/img/mascots/scylla-operator.svg b/branch-4.5/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.5/_static/img/mascots/scylla-plugin.png b/branch-4.5/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-release-mascot.png b/branch-4.5/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-repair.png b/branch-4.5/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-server.png b/branch-4.5/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-sleeping.png b/branch-4.5/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-tall-measure.png b/branch-4.5/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-university.png b/branch-4.5/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-weights.png b/branch-4.5/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-window-cleaning.png b/branch-4.5/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-with-computer-2.png b/branch-4.5/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-with-computer.png b/branch-4.5/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-with-linux.png b/branch-4.5/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-writting.png b/branch-4.5/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.5/_static/img/menu.svg b/branch-4.5/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.5/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.5/_static/img/scylla-monitor.png b/branch-4.5/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.5/_static/img/scylla-monitor.png differ diff --git a/branch-4.5/_static/js/main.bundle.js b/branch-4.5/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-4.5/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
                          • Back
                          • ',backButtonPosition:"top",wrapper:"
                            ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                              "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                              ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                              ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                              ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                              ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                              "],col:[2,"","
                              "],tr:[2,"","
                              "],td:[3,"","
                              "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +

                              ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                              + + +
                              + + + + + +
                              + + +
                              + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/genindex.html b/branch-4.5/genindex.html new file mode 100644 index 000000000..b3912a462 --- /dev/null +++ b/branch-4.5/genindex.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + + + +
                              + + + + + +
                              + + +
                              + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/index.html b/branch-4.5/index.html new file mode 100644 index 000000000..6d8c107a9 --- /dev/null +++ b/branch-4.5/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              ScyllaDB Monitoring Stack

                              +
                              +
                              +

                              ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                              +_images/monitor.png +

                              The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                              +
                                +
                              • prometheus - collects and stores metrics

                              • +
                              • alertmanager - handles alerts

                              • +
                              • grafana - dashboard server

                              • +
                              +

                              Choose a topic to get started:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/docker-compose.html b/branch-4.5/install/docker-compose.html new file mode 100644 index 000000000..ee47f62ca --- /dev/null +++ b/branch-4.5/install/docker-compose.html @@ -0,0 +1,828 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Using Docker Compose

                              +

                              Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                              +

                              Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                              +
                              +

                              Warning

                              +

                              docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                              +
                              +
                              +

                              Prerequisite

                              +

                              Make sure you have docker and docker-compose installed.

                              +
                              +
                              +

                              Setting Prometheus

                              +

                              The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                              +

                              You can use ./prometheus-config.sh to generate the file, for example:

                              +
                              ./prometheus-config.sh --compose
                              +
                              +
                              +

                              For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                              +
                              +
                              +

                              Setting Grafana Provisioning

                              +

                              Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                              +
                              +

                              Grafana Data-Source file

                              +

                              Run the following command to update the datasource:

                              +
                              ./grafana-datasource.sh --compose
                              +
                              +
                              +

                              You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                              +
                              +
                              +

                              Grafana Dashboard Load file

                              +

                              To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                              +
                              ./generate-dashboards.sh -t -v 2020.1
                              +
                              +
                              +

                              This command generates the files under: grafana/provisioning/dashboards/

                              +
                              +
                              +
                              +

                              Docker Compose file

                              +

                              You can use the following example as a base for your docker compose.

                              +

                              Pass the following to a file called docker-compose.yml

                              +
                              services:
                              +  alertmanager:
                              +    container_name: aalert
                              +    image: prom/alertmanager:v0.24.0
                              +    ports:
                              +    - 9093:9093
                              +    volumes:
                              +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                              +  grafana:
                              +    container_name: agraf
                              +    environment:
                              +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                              +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                              +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                              +    # This is where you set Grafana security
                              +    - GF_AUTH_BASIC_ENABLED=false
                              +    - GF_AUTH_ANONYMOUS_ENABLED=true
                              +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                              +    - GF_SECURITY_ADMIN_PASSWORD=admin
                              +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                              +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                              +    image: grafana/grafana:9.3.11
                              +    ports:
                              +    - 3000:3000
                              +    user: 1000:1000
                              +    volumes:
                              +    - ./grafana/build:/var/lib/grafana/dashboards
                              +    - ./grafana/plugins:/var/lib/grafana/plugins
                              +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                              +    # Uncomment the following line for grafana persistency
                              +    # - path/to/grafana/dir:/var/lib/grafana
                              +  loki:
                              +    command:
                              +    - --config.file=/mnt/config/loki-config.yaml
                              +    container_name: loki
                              +    image: grafana/loki:2.7.3
                              +    ports:
                              +    - 3100:3100
                              +    volumes:
                              +    - ./loki/rules:/etc/loki/rules
                              +    - ./loki/conf:/mnt/config
                              +  promotheus:
                              +    command:
                              +    - --config.file=/etc/prometheus/prometheus.yml
                              +    container_name: aprom
                              +    image: prom/prometheus:v2.42.0
                              +    ports:
                              +    - 9090:9090
                              +    volumes:
                              +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                              +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                              +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                              +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                              +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                              +    # Uncomment the following line for prometheus persistency 
                              +    # - path/to/data/dir:/prometheus/data
                              +  promtail:
                              +    command:
                              +    - --config.file=/etc/promtail/config.yml
                              +    container_name: promtail
                              +    image: grafana/promtail:2.7.3
                              +    ports:
                              +    - 1514:1514
                              +    - 9080:9080
                              +    volumes:
                              +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                              +version: '3'
                              +
                              +
                              +
                              +

                              Start and Stop

                              +

                              To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/index.html b/branch-4.5/install/index.html new file mode 100644 index 000000000..ca692e932 --- /dev/null +++ b/branch-4.5/install/index.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Download and Install Scylla Monitoring Stack

                              +
                              +
                              +

                              Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                              +

                              Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/min-prod-hw.html b/branch-4.5/install/min-prod-hw.html new file mode 100644 index 000000000..4639376df --- /dev/null +++ b/branch-4.5/install/min-prod-hw.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Minimal Production System Recommendations

                              +
                                +
                              • CPU - at least 2 physical cores/ 4vCPUs

                              • +
                              • Memory - 15GB+ DRAM and proportional to the number of cores.

                              • +
                              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                              • +
                              • Network - 1GbE/10GbE preferred

                              • +
                              +
                              +

                              Calculating Prometheus Minimal Disk Space requirement

                              +

                              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                              +

                              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                              +

                              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                              +
                              6 * 16 * 15 * 12MB ~ 16GB
                              +
                              +
                              +

                              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                              +
                              +
                              +

                              Calculating Prometheus Minimal Memory Space requirement

                              +

                              Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                              +

                              For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                              + +
                              + +++++++ + + + +
                              # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                              00
                              + +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/monitor-without-docker.html b/branch-4.5/install/monitor-without-docker.html new file mode 100644 index 000000000..03455f4dc --- /dev/null +++ b/branch-4.5/install/monitor-without-docker.html @@ -0,0 +1,1171 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Deploying Scylla Monitoring Stack Without Docker

                              +
                              +

                              Introduction

                              +

                              The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                              +

                              Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                              +

                              Scylla Monitoring uses the following components:

                              +
                                +
                              • Alertmanager

                              • +
                              • Grafana Loki

                              • +
                              • Prometheus

                              • +
                              • Grafana

                              • +
                              +

                              The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                              +

                              We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                              +
                              +
                              +

                              Minimal Production System Recommendations

                              +
                                +
                              • CPU - at least 2 physical cores/ 4vCPUs

                              • +
                              • Memory - 15GB+ DRAM and proportional to the number of cores.

                              • +
                              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                              • +
                              • Network - 1GbE/10GbE preferred

                              • +
                              +
                              +

                              Calculating Prometheus Minimal Disk Space requirement

                              +

                              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                              +

                              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                              +

                              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                              +
                              6 * 16 * 15 * 12MB ~ 16GB
                              +
                              +
                              +

                              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                              +
                              +
                              +

                              Calculating Prometheus Minimal Memory Space requirement

                              +

                              Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                              +

                              For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                              + +
                              + +++++++ + + + +
                              # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                              00
                              + +
                              +

                              The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                              +
                              +

                              Note

                              +

                              Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                              +
                              +
                              +
                              +
                              +

                              Install Scylla Monitoring Stack

                              +

                              The following procedure uses a CentOS 7 based instance

                              +
                                +
                              1. Download the latest Scylla Monitoring Stack release.

                              2. +
                              +
                              wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.5.1.tar.gz
                              +
                              +
                              +
                                +
                              1. Open the tar

                              2. +
                              +

                              tar -xvf scylla-monitoring-*.tar.gz

                              +
                              +
                              +

                              Install Alertmanager

                              +

                              Tested with alertmanager 0.22.2 version

                              +
                                +
                              1. Install alertmanager

                              2. +
                              +
                              wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                              +tar -xvf alertmanager-*.linux-amd64.tar.gz
                              +
                              +
                              +
                                +
                              1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                              2. +
                              +

                              For example:

                              +
                              cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.5.1/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                              +
                              +
                              +
                                +
                              1. Start the Alertmanager

                              2. +
                              +

                              For example:

                              +
                              cd alertmanager-0.22.2.linux-amd64
                              +./alertmanager
                              +
                              +
                              +
                                +
                              1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                              2. +
                              +

                              For example:

                              +
                              http://192.168.135.166:9093/
                              +
                              +
                              +../_images/alertmanager.png +
                              +
                              +

                              Install Grafana Loki

                              +

                              Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                              +

                              We recomand using Loki with containers, but you can install it locally as described in Loki installation

                              +

                              You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                              +

                              Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                              +

                              Loki Related files

                              +

                              Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                              +
                              mkdir -p /etc/loki/rules
                              +mkdir -p /etc/loki/config
                              +cp loki/rules/* /etc/loki/rules
                              +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                              +
                              +
                              +

                              Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                              +

                              Promtail Related files

                              +

                              Promtail has a configuration file. You need to copy and modify the configuration.

                              +
                              mkdir -p /etc/promtail/
                              +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                              +
                              +
                              +

                              Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                              +
                              +
                              +

                              Install Prometheus

                              +

                              Tested with Prometheus version 2.27.1

                              +
                              +

                              Note

                              +

                              If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                              +
                              +
                                +
                              1. Install Prometheus

                              2. +
                              +
                              wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                              +tar -xvf prometheus-*.linux-amd64.tar.gz
                              +
                              +
                              +

                              2. Create Data and Config directories +.. code-block:: shell

                              +
                              +

                              mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                              +
                              +
                                +
                              1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                              2. +
                              +

                              Copy prometheus/prometheus.yml.template to prometheus.yml

                              +

                              For example:

                              +
                              cp scylla-monitoring-scylla-monitoring-4.5.1/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                              +cp scylla-monitoring-scylla-monitoring-4.5.1/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                              +
                              +
                              +
                                +
                              1. Edit the prometheus.yml file to point to the correct static data sources.

                              2. +
                              +
                              +

                              Note

                              +

                              Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                              +
                              +
                              vi /etc/prometheus/prometheus.yml
                              +
                              +
                              +

                              Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                              +

                              For example if the alertmanager will run on the same host:

                              +
                              alerting:
                              +   alertmanagers:
                              +   - static_configs:
                              +       - targets:
                              +           - 127.0.0.1:9093
                              +
                              +
                              +

                              Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                              +

                              For example the scrape config for Scylla:

                              +
                              global:
                              +  scrape_interval: 5s # By default, scrape targets every 5 second.
                              +  scrape_timeout: 4s # Timeout before trying to scape a target again
                              +
                              +  # Attach these labels to any time series or alerts when communicating with
                              +  # external systems (federation, remote storage, Alertmanager).
                              +  external_labels:
                              +    monitor: 'scylla-monitor'
                              +
                              +scrape_configs:
                              +- job_name: scylla
                              +  honor_labels: false
                              +  file_sd_configs:
                              +    - files:
                              +      - /etc/scylla.d/prometheus/scylla_servers.yml
                              +  relabel_configs:
                              +    - source_labels: [__address__]
                              +      regex:  '([^:]+)'
                              +      target_label: __address__
                              +      replacement: '${1}:9180'
                              +
                              +    - source_labels: [__address__]
                              +      regex:  '(.*):.+'
                              +      target_label: instance
                              +      replacement: '${1}'
                              +
                              +
                              +
                                +
                              1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                              2. +
                              +
                              +

                              Note

                              +

                              There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                              +
                              +

                              An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                              +
                              +

                              Note

                              +

                              You must have both files even if you are not using Scylla Manager

                              +
                              +

                              Add the labels for the cluster and data-center

                              +

                              scylla_servers.yml:

                              +

                              For example:

                              +
                              cat scylla_servers.yml
                              +# List Scylla end points
                              +
                              +- targets:
                              +  - 192.168.66.6
                              +  - 192.168.66.244
                              +  labels:
                              +    cluster: cluster1
                              +    dc: dc1
                              +- targets:
                              +    - 172.17.0.3
                              +  labels:
                              +    cluster: cluster1
                              +    dc: dc2
                              +
                              +
                              +
                              +

                              Note

                              +

                              See the previous note about deprecating the node_exporter_servers.yml file.

                              +
                              +

                              scylla_manager_server.yml

                              +

                              For example:

                              +
                              - targets:
                              +  - 127.0.0.1:5090
                              +
                              +
                              +
                                +
                              1. Start Prometheus server:

                              2. +
                              +

                              For example:

                              +
                              cd scylla-monitoring-scylla-monitoring-4.5.1/
                              +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                              +
                              +
                              +

                              Data should start accumulate on: /prometheus/data

                              +
                                +
                              1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                              2. +
                              +

                              For example:

                              +
                              http://192.168.135.166:9090/
                              +
                              +
                              +../_images/1.png +

                              Prometheus console should be visible

                              +
                                +
                              1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                              2. +
                              +

                              For example:

                              +

                              node_memory_MemFree

                              +../_images/2.png +

                              And

                              +

                              scylla_reactor_utilization

                              +../_images/3.png +

                              At this point Scylla is emitting the metrics and Prometheus is able to store them.

                              +
                              +
                              +

                              Install Grafana

                              +

                              Tested with Grafna 7.5.7

                              +
                                +
                              1. Install Grafana based on the instructions here

                              2. +
                              +

                              Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                              +
                                +
                              1. Access Scylla-Grafana-monitoring directory

                              2. +
                              +
                              cd scylla-monitoring-scylla-monitoring-4.5.1/
                              +
                              +
                              +
                                +
                              1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                              2. +
                              +
                              sudo cp -r grafana/plugins /var/lib/grafana/
                              +
                              +
                              +

                              If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                              +

                              For example:

                              +
                              cp -r grafana/plugins ../grafana-7.5.7/public/app
                              +
                              +
                              +
                                +
                              1. Provision the Dashboards

                              2. +
                              +

                              For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                              +

                              For Grafana installed with yum install

                              +
                              sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                              +sudo mkdir -p /var/lib/grafana/dashboards
                              +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                              +
                              +
                              +

                              For Grafana installed from packages

                              +
                              cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                              +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                              +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                              +
                              +
                              +

                              Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                              +
                              +

                              Note

                              +

                              A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                              +
                              +
                                +
                              1. Set the data source by copy datasource.yml and edit it

                              2. +
                              +
                              sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                              +
                              +
                              +
                              +

                              Note

                              +

                              Scylla uses a plugin to read from some system tables see the section below about using it.

                              +
                              +

                              For Grafana installed from packages

                              +
                              cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                              +
                              +
                              +

                              You should set the Prometheus and the alertmanager IP and port.

                              +

                              For example

                              +
                              sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                              +apiVersion: 1
                              +datasources:
                              + - name: prometheus
                              +   type: prometheus
                              +   url: http://192.168.135.167:9090
                              +   access: proxy
                              +   basicAuth: false
                              +
                              + - name: alertmanager
                              +   type: camptocamp-prometheus-alertmanager-datasource
                              +   orgId: 1
                              +   typeLogoUrl: public/img/icn-datasource.svg
                              +   access: proxy
                              +   url: http://192.168.135.166:9093
                              +   password:
                              +   user:
                              +   database:
                              +   basicAuth:
                              +   isDefault:
                              +   jsonData:
                              +     severity_critical: '4'
                              +     severity_high: '3'
                              +     severity_warning: '2'
                              +     severity_info: '1'
                              +
                              +
                              +
                                +
                              1. Start the Grafana service

                              2. +
                              +

                              For Grafana installed with yum install

                              +

                              sudo service grafana-server start

                              +

                              For Grafana installed from packages:

                              +

                              cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                              +

                              Edit scylla.ini to reflect the right paths in the paths section of the file.

                              +
                              plugins = /home/centos/grafana-7.5.7/data/plugins
                              +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                              +
                              +
                              +

                              Start the server:

                              +
                              cd /home/centos/grafana-7.5.7/
                              +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                              +
                              +
                              +
                                +
                              1. Make sure Grafana is running

                              2. +
                              +

                              Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                              +../_images/grafana.png +
                              +
                              +

                              Using Scylla Plugin with Grafana

                              +

                              Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                              +

                              Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                              +
                              +

                              Setting a monitoring user

                              +

                              This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                              +
                                +
                              • If you have not done so, enable authorization first.

                              • +
                              • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                              • +
                              • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                              • +
                              +
                              +
                              +

                              Installing the Plugin

                              +

                              Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                              +
                              +
                              +

                              Configure the Plugin

                              +

                              Add an entry to the datasource.yml file

                              +
                              - name: scylla-datasource
                              +  type: scylladb-scylla-datasource
                              +  orgId: 1
                              +  isDefault:
                              +  jsonData:
                              +  host: ''
                              +#  secureJsonData:
                              +#    user: 'scylla_monitoring'
                              +#    password: 'scylla_monitoring'
                              +
                              +
                              +

                              As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                              +
                              +
                              +

                              Enable the Plugin

                              +

                              Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                              +

                              See more about it the Grafana configurtion.

                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/monitoring-stack.html b/branch-4.5/install/monitoring-stack.html new file mode 100644 index 000000000..8c79376f4 --- /dev/null +++ b/branch-4.5/install/monitoring-stack.html @@ -0,0 +1,1114 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Install Scylla Monitoring Stack

                              +

                              This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                              +

                              The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                              +

                              For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                              +
                              +

                              Minimal Production System Recommendations

                              +
                                +
                              • CPU - at least 2 physical cores/ 4vCPUs

                              • +
                              • Memory - 15GB+ DRAM and proportional to the number of cores.

                              • +
                              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                              • +
                              • Network - 1GbE/10GbE preferred

                              • +
                              +
                              +

                              Calculating Prometheus Minimal Disk Space requirement

                              +

                              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                              +

                              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                              +

                              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                              +
                              6 * 16 * 15 * 12MB ~ 16GB
                              +
                              +
                              +

                              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                              +
                              +
                              +

                              Calculating Prometheus Minimal Memory Space requirement

                              +

                              Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                              +

                              For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                              + +
                              + +++++++ + + + +
                              # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                              00
                              + +
                              +
                              +
                              +
                              +

                              Prerequisites

                              +
                                +
                              • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                              • +
                              • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                              • +
                              + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              Scylla Monitoring Stack Compatibility Matrix

                              Scylla Monitoring Stack Version

                              Prometheus Version

                              Grafana Version

                              4.5

                              2.47.1

                              10.1.5

                              4.4

                              2.44.0

                              9.5.2

                              4.3

                              2.42.0

                              9.3.8

                              4.2

                              2.41.0

                              9.3.4

                              4.1

                              2.38.0

                              9.1.0

                              4.0

                              2.34.0

                              8.5.2

                              3.11

                              2.32.0

                              8.3.4

                              3.10

                              2.32.0

                              8.3.3

                              3.9.2

                              2.29.1

                              8.2.7

                              3.9

                              2.29.1

                              8.1.1

                              3.8

                              2.27.1

                              7.5.7

                              3.7

                              2.25.2

                              7.4.0

                              3.6

                              2.18.1

                              7.3.5

                              3.5

                              2.18.1

                              7.1.5

                              3.4

                              2.18.1

                              6.7.3

                              +
                              +
                              +

                              Docker Post Installation

                              +

                              Docker post installation guide can be found here

                              +
                              +

                              Note

                              +

                              Avoid running the container as root.

                              +
                              +

                              To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                              +
                                +
                              1. Create the Docker group.

                              2. +
                              +
                              sudo groupadd docker
                              +
                              +
                              +
                                +
                              1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                              2. +
                              +
                              sudo usermod -aG docker $USER
                              +
                              +
                              +
                                +
                              1. Start Docker by calling:

                              2. +
                              +
                              sudo systemctl enable docker
                              +
                              +
                              +
                              +
                              +

                              Install Scylla Monitoring Stack

                              +

                              Procedure

                              +
                                +
                              1. Download and extract the latest Scylla Monitoring Stack binary;.

                              2. +
                              +
                              wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.5.1.tar.gz
                              +tar -xvf scylla-monitoring-4.5.1.tar.gz
                              +cd scylla-monitoring-scylla-monitoring-4.5.1
                              +
                              +
                              +

                              As an alternative, you can clone and use the Git repository directly.

                              +
                              git clone https://github.com/scylladb/scylla-monitoring.git
                              +cd scylla-monitoring
                              +git checkout branch-4.5
                              +
                              +
                              +
                                +
                              1. Start Docker service if needed

                              2. +
                              +
                              sudo systemctl restart docker
                              +
                              +
                              +
                              +
                              +

                              Configure Scylla Monitoring Stack

                              +

                              To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                              +

                              This configuration can be done from files, or using the Consul api.

                              +

                              Scylla Manager 2.0 and higher supports the Consul API.

                              +
                              +

                              Configure Scylla nodes from files

                              +
                                +
                              1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                              2. +
                              +
                              +

                              Note

                              +

                              It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                              +
                              +

                              For example:

                              +
                              - targets:
                              +      - 172.17.0.2
                              +      - 172.17.0.3
                              +  labels:
                              +      cluster: cluster1
                              +      dc: dc1
                              +
                              +
                              +
                              +

                              Note

                              +

                              If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                              +
                              +

                              Using IPV6

                              +

                              To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                              +

                              For example:

                              +
                              - targets:
                              +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                              +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                              +  labels:
                              +      cluster: cluster1
                              +      dc: dc1
                              +
                              +
                              +
                              +

                              Note

                              +

                              For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                              +
                              +

                              For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                              +
                              +

                              Note

                              +

                              By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                              +
                              +

                              If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                              +

                              For example:

                              +
                              ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                              +
                              +
                              +

                              Mark the different Data Centers with Labels.

                              +

                              As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                              +

                              You can use the genconfig.py script to generate the server file. For example:

                              +
                              ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                              +
                              +
                              +

                              This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                              +

                              OR

                              +

                              The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                              +
                              nodetool status | ./genconfig.py -NS
                              +
                              +
                              +

                              2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                              +

                              You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                              +

                              For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                              +
                              # List Scylla Manager end points
                              +
                              +- targets:
                              +  - 172.17.0.7:5090
                              +
                              +
                              +

                              Note that you do not need to add labels to the Scylla Manager targets.

                              +
                              +
                              +

                              Configure Scylla nodes using Scylla-Manager Consul API

                              +

                              Scylla Manager 2.0 has a Consul like API.

                              +

                              When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                              +

                              For example:

                              +
                              ./start-all.sh -L 10.10.0.1
                              +
                              +
                              +
                              +

                              Note

                              +

                              If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                              +
                              +
                              +
                              +

                              Connecting Scylla-Monitoring to ScyllaDB

                              +

                              Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                              +

                              You can limit the user to read only, currently it only read table from the system keyspace.

                              +

                              You can set a user and password from a file or environment variables.

                              +

                              If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                              +

                              To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                              +
                              +

                              Note

                              +

                              It is best to use a dedicated user and password with limited privileges.

                              +
                              +
                              +
                              +

                              Use an external directory for the Prometheus data directory

                              +

                              The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                              +
                              +

                              Note

                              +

                              Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                              +
                              +

                              If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                              +

                              In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                              +
                              +
                              +

                              Add Additional Prometheus Targets

                              +

                              There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                              +

                              The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                              +

                              You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                              +
                              - job_name: 'myservice'
                              +  # Override the global default and scrape targets from this job every 5 seconds.
                              +  scrape_interval: 5s
                              +  static_configs:
                              +    - targets:
                              +      - 17.0.0.1:7000
                              +
                              +
                              +
                              +
                              +
                              +

                              Start and Stop Scylla Monitoring Stack

                              +
                              +

                              Start

                              +
                              ./start-all.sh -d prometheus_data
                              +
                              +
                              +
                              +
                              +

                              Stop

                              +
                              ./kill-all.sh
                              +
                              +
                              +
                              +
                              +

                              Start a Specific Scylla Monitoring Stack Version

                              +

                              By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                              +

                              You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                              +

                              Multiple versions are supported. For example:

                              +
                              ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                              +
                              +
                              +

                              will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                              +
                              +
                              +

                              Accessing the localhost

                              +

                              The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                              +
                              ./start-all.sh -l -d prometheus-data
                              +
                              +
                              +
                              +
                              +

                              Configure rsyslog on each Scylla node

                              +

                              generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                              +

                              Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                              +

                              Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                              +

                              If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                              +
                              if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                              +
                              +
                              +

                              Restart rsyslog for the configuration to take effect.

                              +
                              systemctl restart rsyslog
                              +
                              +
                              +
                              +
                              +
                              +

                              View Grafana Dashboards

                              +

                              Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/start-all.html b/branch-4.5/install/start-all.html new file mode 100644 index 000000000..59a1c786f --- /dev/null +++ b/branch-4.5/install/start-all.html @@ -0,0 +1,769 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              The start-all.sh Command

                              +

                              Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                              +

                              The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                              +
                              +

                              General Options

                              +

                              -h Help, Print the help, and exit.

                              +

                              –version print the current Scylla-Monitoring stack version, and exit.

                              +

                              -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                              +

                              -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                              +

                              -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                              +

                              –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                              +
                              + + +
                              +

                              Alert Manager

                              +

                              The Alertmanager handles the alerts and takes the following parameters:

                              +

                              -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                              +

                              -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                              +

                              -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/thanos.html b/branch-4.5/install/thanos.html new file mode 100644 index 000000000..0c02f1fca --- /dev/null +++ b/branch-4.5/install/thanos.html @@ -0,0 +1,769 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Using Thanos as Data Source With Scylla Monitoring Stack

                              +

                              Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                              +
                                +
                              • High-availability.

                              • +
                              • Horizontal scaling.

                              • +
                              • Backup.

                              • +
                              +

                              The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                              +

                              The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                              +
                              +

                              Using Thanos As a Prometheus Aggregator

                              +

                              There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                              +
                              +

                              Prometheus Configuration

                              +

                              We will assume you have two Prometheus servers running.

                              +
                                +
                              1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                              2. +
                              3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                              4. +
                              +
                              +
                              +

                              Thanos sidecar

                              +

                              The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                              +
                              docker run -d \
                              + -v /path/to/prom/dir:/data/prom:z \
                              + -i --name sidecar thanosio/thanos \
                              + sidecar \
                              + --grpc-address=0.0.0.0:10911 \
                              + --grpc-grace-period=1s \
                              + --http-address=0.0.0.0:10912 \
                              + --http-grace-period=1s \
                              + --prometheus.url=http://prometheus-ip:9090 \
                              + --tsdb.path=/data/prom \
                              + -p 10912:10912 \
                              + -p 10911:10911
                              +
                              +
                              +

                              After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                              +
                              +
                              +

                              Thanos query

                              +

                              Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                              +
                              docker run -d \
                              + --name thanos -- thanosio/thanos \
                              +   query \
                              +   --debug.name=query0 \
                              +   --log.level=debug \
                              +   --grpc-address=0.0.0.0:10903 \
                              +   --grpc-grace-period=1s \
                              +   --http-address=0.0.0.0:10904 \
                              +   --http-grace-period=1s \
                              +   --query.replica-label=prometheus \
                              +   --store={ip1}:10911 --store={ip2}:10911
                              +
                              +
                              +

                              After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                              +
                              +
                              +

                              Update Scylla Data source

                              +

                              The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                              +

                              The file you edit is a template file that replaces the file Grafana uses, next time you start.

                              +

                              Restart the Scylla Monitoring Stack it should now use Thanos.

                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/intro.html b/branch-4.5/intro.html new file mode 100644 index 000000000..d7a354c3a --- /dev/null +++ b/branch-4.5/intro.html @@ -0,0 +1,718 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              ScyllaDB Monitoring Stack

                              +

                              ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                              +_images/monitor.png +

                              The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                              +
                                +
                              • prometheus - Collects and stores metrics

                              • +
                              • grafan-loki - Parses logs and generates metrics and alerts

                              • +
                              • alertmanager - Handles alerts

                              • +
                              • grafana - Dashboards server

                              • +
                              +

                              A few optional components are used for additional services

                              +
                                +
                              • grafana-image-renderer - Allows you to download a dashboard as an image.

                              • +
                              • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                              • +
                              +
                              +

                              High Level Architecture

                              +_images/monitoring_stack1.png +

                              We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                              +

                              We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                              +

                              The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                              +

                              We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                              +

                              Choose a topic to get started:

                              + +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/objects.inv b/branch-4.5/objects.inv new file mode 100644 index 000000000..9485eb596 Binary files /dev/null and b/branch-4.5/objects.inv differ diff --git a/branch-4.5/procedures/alerts/alerting.html b/branch-4.5/procedures/alerts/alerting.html new file mode 100644 index 000000000..25c7dbeb2 --- /dev/null +++ b/branch-4.5/procedures/alerts/alerting.html @@ -0,0 +1,765 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Alerting

                              +

                              Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                              +

                              You can read more about Prometheus alerting here

                              +

                              By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                              +

                              In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                              +

                              The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                              +../../_images/monitoring_stack.png +
                              +

                              Prometheus Alerts

                              +

                              The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                              +

                              Each alert consists of:

                              +
                                +
                              • Name

                              • +
                              • What happened

                              • +
                              • For how long

                              • +
                              • What to report

                              • +
                              +

                              For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                              +
                              - alert: InstanceDown
                              +  expr: up == 0
                              +  for: 60s
                              +  labels:
                              +    severity: "2"
                              +  annotations:
                              +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                              +    summary: Instance {{ $labels.instance }} down
                              +
                              +
                              +

                              The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                              +

                              The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                              +

                              The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                              +

                              annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                              +
                              +
                              +

                              Alertmanager

                              +

                              The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                              +

                              The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                              +
                                +
                              • Routes: Represent a routing tree, the most specific rule, wins

                              • +
                              • Inhibition: Mute an alert, based on another alert

                              • +
                              • Receiver: Send a notification via email, sluck, etc’

                              • +
                              +

                              Check the Alertmanager documentation for details on how to specify a specific receiver.

                              +

                              In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                              +
                              +
                              +

                              Tips When Adding an Alert

                              +

                              It’s worse having an alert that does not work, than not having an alert at all

                              +

                              There are multiple ways you can use to make sure your alert is set correctly:

                              +
                                +
                              • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                              • +
                              • Force the alert to be active by reducing the limits or the duration.

                              • +
                              • When possible simulate the actual scenario and see that the alert works as expected.

                              • +
                              +

                              For example, low available disk space.

                              +

                              Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                              +

                              Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                              +

                              Starting with a simple working expression helps you bisect problems.

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/procedures/alerts/index.html b/branch-4.5/procedures/alerts/index.html new file mode 100644 index 000000000..a61ea70f7 --- /dev/null +++ b/branch-4.5/procedures/alerts/index.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Stack Alert Manager

                              +
                              +
                              +

                              Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/procedures/datadog/index.html b/branch-4.5/procedures/datadog/index.html new file mode 100644 index 000000000..c98633bb6 --- /dev/null +++ b/branch-4.5/procedures/datadog/index.html @@ -0,0 +1,762 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Datadog Integration

                              +

                              The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                              +
                                +
                              1. Installing and configuring the Datadog Agent.

                              2. +
                              3. Add Datadog recording rules.

                              4. +
                              5. Loading Scylla dashboard to Datadog.

                              6. +
                              7. Optionally load Monitor (Alerts).

                              8. +
                              +
                              +

                              Note

                              +

                              Scylla Cloud users, use and update the proper configuration file.

                              +
                              +
                              +

                              Install And configure the Datadog Agent

                              +

                              Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                              +

                              Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                              +
                              +

                              Scylla Cloud Users

                              +

                              Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                              +

                              Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                              +
                              +
                              +

                              Other Scylla Users

                              +

                              Other Scylla users, download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                              +
                              +
                              +

                              Post configuration

                              +

                              Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                              +
                              +

                              Note

                              +

                              By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                              +
                              +
                              +
                              +
                              +

                              Add datadog recording rules

                              +

                              Non Scylla Cloud users, download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                              +

                              Cloud users, skip this step, it’s been take care for by the cloud.

                              +
                              +
                              +

                              Upload the Dashboard

                              +

                              Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                              +
                              +
                              +

                              Using the Dashboard

                              +

                              We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                              +../../_images/datadog.png +

                              The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                              +
                              +

                              Note

                              +

                              Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                              +
                              +
                              +
                              +

                              Adding Monitor

                              +

                              Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/procedures/index.html b/branch-4.5/procedures/index.html new file mode 100644 index 000000000..8ed00e519 --- /dev/null +++ b/branch-4.5/procedures/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              ScyllaDB Monitoring Stack Procedures

                              +
                              +
                              +

                              There are several reference guides available which give additional information. Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/procedures/updating-dashboard.html b/branch-4.5/procedures/updating-dashboard.html new file mode 100644 index 000000000..3918d8596 --- /dev/null +++ b/branch-4.5/procedures/updating-dashboard.html @@ -0,0 +1,974 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Adding and Modifying Dashboards

                              +

                              This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                              +

                              It covers dashboard templates and how to modify them.

                              + +
                              +

                              General Limitations

                              +

                              Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                              +
                              +

                              Consistency Between Restarts

                              +

                              By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                              +
                              +
                              +

                              Consistency Between Upgrades

                              +

                              As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                              +
                              +

                              Note

                              +

                               You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                              +
                              +

                              At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                              +
                              +
                              +
                              +

                              Using Templated Dashboards

                              +

                              Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                              +

                              Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                              +

                              For example a typical graph panel would look like this:

                              +
                              {
                              +    "aliasColors": {},
                              +    "bars": false,
                              +    "datasource": "prometheus",
                              +    "editable": true,
                              +    "error": false,
                              +    "fill": 0,
                              +    "grid": {
                              +        "threshold1": null,
                              +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                              +        "threshold2": null,
                              +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                              +    },
                              +    "gridPos": {
                              +        "h": 6,
                              +        "w": 10,
                              +        "x": 0,
                              +        "y": 4
                              +    },
                              +    "id": 2,
                              +    "isNew": true,
                              +    "legend": {
                              +        "avg": false,
                              +        "current": false,
                              +        "max": false,
                              +        "min": false,
                              +        "show": false,
                              +        "total": false,
                              +        "values": false
                              +    },
                              +    "lines": true,
                              +    "linewidth": 2,
                              +    "links": [],
                              +    "nullPointMode": "connected",
                              +    "percentage": false,
                              +    "pointradius": 5,
                              +    "points": false,
                              +    "renderer": "flot",
                              +    "seriesOverrides": [
                              +        {}
                              +    ],
                              +    "span": 5,
                              +    "stack": false,
                              +    "steppedLine": false,
                              +    "targets": [
                              +        {
                              +            "expr": "sum(node_filesystem_avail) by (instance)",
                              +            "intervalFactor": 1,
                              +            "legendFormat": "",
                              +            "refId": "A",
                              +            "step": 1
                              +        }
                              +    ],
                              +    "timeFrom": null,
                              +    "timeShift": null,
                              +    "title": "Available Disk Size",
                              +    "tooltip": {
                              +        "msResolution": false,
                              +        "shared": true,
                              +        "sort": 0,
                              +        "value_type": "cumulative"
                              +    },
                              +    "transparent": false,
                              +    "type": "graph",
                              +    "xaxis": {
                              +        "show": true
                              +    },
                              +    "yaxes": [
                              +        {
                              +            "format": "percent",
                              +            "logBase": 1,
                              +            "max": 101,
                              +            "min": 0,
                              +            "show": true
                              +        },
                              +        {
                              +            "format": "short",
                              +            "logBase": 1,
                              +            "max": null,
                              +            "min": null,
                              +            "show": true
                              +        }
                              +    ]
                              +}
                              +
                              +
                              +

                              As you can imagine, most panels would have similar values.

                              +

                              To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                              +
                              +

                              The Template Class System

                              +

                              The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                              +

                              The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                              +

                              In the template file, you can also add or override attributes.

                              +

                              The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                              +

                              When generating dashboards, each class will be replaced by its definition.

                              +

                              For example, a row in the type.json is defined as:

                              +
                              {
                              + "base_row": {
                              +     "collapse": false,
                              +     "editable": true
                              + },
                              + "row": {
                              +     "class": "base_row",
                              +     "height": "250px"
                              + }
                              + }
                              +
                              +
                              +

                              Will be used like in a template:

                              +
                              {
                              +     "class": "row",
                              +     "height": "150px",
                              +     "panels": [
                              +     ]
                              +}
                              +
                              +
                              +

                              And the output will be:

                              +
                              {
                              +     "class": "row",
                              +     "collapse": false,
                              +     "editable": true,
                              +     "height": "150px",
                              +     "panels": [
                              +
                              +     ]
                              +}
                              +
                              +
                              +

                              We can see that the template added the panels attribute and that it overrides the height attribute.

                              +
                              +
                              +

                              Panel Example

                              +

                              Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                              +
                              {
                              +     "class": "row",
                              +     "panels": [
                              +         {
                              +             "class": "bytes_panel",
                              +             "span": 3,
                              +             "targets": [
                              +                 {
                              +                     "expr": "sum(node_filesystem_avail) by (instance)",
                              +                     "intervalFactor": 1,
                              +                     "legendFormat": "",
                              +                     "metric": "",
                              +                     "refId": "A",
                              +                     "step": 1
                              +                 }
                              +             ],
                              +             "title": "Available Disk Size"
                              +         }
                              +     ]
                              +}
                              +
                              +
                              +

                              In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                              +

                              You can also see that the span attribute is overridden to set the panel size.

                              +

                              To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                              +
                              +
                              +

                              Grafana Formats and Layouts

                              +

                              The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                              +

                              Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                              +

                              The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                              +

                              To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                              +

                              The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                              +

                              You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                              +

                              gridPos has the following attributes:

                              +
                              {
                              +   "x": 0,
                              +   "y": 0,
                              +   "w": 24,
                              +   "h": 4
                              + }
                              +
                              +
                              +

                              When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                              +
                              {
                              +   "gridPos": {
                              +      "h": 2
                              +    }
                              +}
                              +
                              +
                              +
                              +
                              +

                              Generating the dashboards from templates (generate-dashboards.sh)

                              +
                              +

                              Prerequisite

                              +

                              Python 2.7

                              +

                              make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                              +

                              Use the -h flag to get help information.

                              +

                              You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                              +

                              When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                              +

                              For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                              +

                              .\generate-dashboards.sh -v 2020.1

                              +
                              +

                              Note

                              +

                              generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                              +
                              +
                              +
                              +
                              +

                              Validation

                              +

                              After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                              +

                              Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/reference/index.html b/branch-4.5/reference/index.html new file mode 100644 index 000000000..1f189dfed --- /dev/null +++ b/branch-4.5/reference/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Stack Reference Guide

                              +
                              +
                              +

                              There are several reference guides available which give additional information. Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/reference/matrix.html b/branch-4.5/reference/matrix.html new file mode 100644 index 000000000..0bfd9546b --- /dev/null +++ b/branch-4.5/reference/matrix.html @@ -0,0 +1,864 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Stack Support Matrix

                              +

                              The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                              + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                              Scylla Monitoring Stack Version

                              Scylla Open Source Version

                              Scylla Enterprise Version

                              Node_exporter[1] Version

                              Scylla Manager Version

                              4.5

                              5.0,5.1,5.2,5.4

                              2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                              1.4.1

                              3.0, 3.1, 3.2

                              4.4.5

                              5.0,5.1,5.2,5.4

                              2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                              1.4.1

                              3.0, 3.1, 3.2

                              4.4

                              5.0,5.1,5.2

                              2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                              1.4.1

                              3.0, 3.1

                              4.3

                              5.0,5.1,5.2

                              2020.1, 2021.1, 2022.1, 2022.2

                              1.4.1

                              2.5, 2.6, 3.0

                              4.2

                              4.5,4.6,5.0,5.1

                              2020.1, 2021.1, 2022.1, 2022.2

                              1.4.1

                              2.5, 2.6, 3.0

                              4.1

                              4.5,4.6,5.0,5.1

                              2020.1, 2021.1, 2022.1, 2022.2

                              0.17

                              2.5, 2.6, 3.0

                              4.0

                              4.3, 4.4, 4.5, 4.6, 5.0

                              2020.1, 2021.1, 2022.1

                              0.17

                              2.3, 2.4, 2.5, 2.6, 3.0

                              3.11

                              4.3, 4.4, 4.5, 4.6, 5.0

                              2020.1, 2021.1, 2022.2

                              0.17

                              2.3, 2.4, 2.5, 2.6

                              3.10

                              4.3, 4.4, 4.5, 4.6

                              2020.1, 2021.1

                              0.17

                              2.3, 2.4, 2.5, 2.6

                              3.9

                              4.3, 4.4, 4.5, 4.6

                              2020.1, 2021.1

                              0.17

                              2.3, 2.4, 2.5

                              3.8

                              4.3, 4.4, 4.5

                              2020.1, 2021.1

                              0.17

                              2.3, 2.4, 2.5

                              3.7

                              4.2, 4.3, 4.4

                              2019.1, 2020.1, 2021.1

                              0.17

                              2.2, 2.3

                              3.6.3

                              4.2, 4.3, 4.4

                              2019.1, 2020.1, 2021.1

                              0.17

                              2.2, 2.3, 2.1

                              3.6

                              4.1, 4.2, 4.3

                              2019.1, 2020.1

                              0.17

                              2.1, 2.2, 2.3

                              3.6.1

                              4.1, 4.2, 4.3

                              2019.1, 2020.1

                              0.17

                              2.1, 2.2

                              3.6.1

                              4.1, 4.2, 4.3, 4.4

                              2019.1, 2020.1

                              0.17

                              2.1, 2.2

                              3.5

                              3.3, 4.0, 4.1, 4.2

                              2019.1, 2020.1

                              0.17

                              2.0, 2.1, 2.2

                              3.4.3

                              3.3, 4.0, 4.1, 4.2

                              2019.1, 2020.1

                              0.17

                              2.0, 2.1

                              3.4

                              3.3, 4.0, 4.1

                              2018.1, 2019.1

                              0.17

                              2.0, 2.1

                              3.3

                              3.1, 3.2, 3.3, 4.0

                              2018.1, 2019.1

                              0.17

                              1.4, 2.0, 2.1

                              3.2

                              3.1, 3.2, 3.3

                              2018.1, 2019.1

                              0.17

                              1.4, 2.0

                              3.1

                              2.3, 3.0, 3.1, 3.2

                              2018.1, 2019.1

                              0.17

                              1.3, 1.4, 2.0

                              3.0

                              2.3, 3.0, 3.1, 3.2

                              2018.1, 2019.1

                              0.17

                              1.3, 1.4

                              2.4

                              2.3, 3.0, 3.1

                              2018.1, 2019.1

                              0.14, 0.17

                              1.3, 1.4

                              2.3

                              2.3, 3.0

                              2018.1, 2019.1

                              0.14, 0.17

                              1.3

                              2.2

                              2.3, 3.0

                              2018.1, 2019.1

                              0.14, 0.17

                              1.3

                              2.1

                              2.3, 3.0

                              2018.1

                              0.14, 0.17

                              1.3

                              +

                              [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/reference/monitoring-apis.html b/branch-4.5/reference/monitoring-apis.html new file mode 100644 index 000000000..2c659c7c5 --- /dev/null +++ b/branch-4.5/reference/monitoring-apis.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Stack Interfaces

                              +

                              Scylla exposes two interfaces for online monitoring, as described below

                              +
                              +

                              Prometheus API

                              +

                              By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                              +

                              For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                              +

                              You can change the Prometheus listening address and port in scylla.yaml file

                              +
                              # prometheus port
                              +# By default, Scylla opens prometheus API port on port 9180
                              +# setting the port to 0 will disable the prometheus API.
                              +prometheus_port: 9180
                              +#
                              +# prometheus address
                              +# By default, Scylla binds all interfaces to the prometheus API
                              +# It is possible to restrict the listening address to a specific one
                              +prometheus_address: 0.0.0.0
                              +
                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/robots.txt b/branch-4.5/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.5/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.5/search.html b/branch-4.5/search.html new file mode 100644 index 000000000..3d2a8c537 --- /dev/null +++ b/branch-4.5/search.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + + + +
                              + + + + + +
                              + + +
                              + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/searchindex.js b/branch-4.5/searchindex.js new file mode 100644 index 000000000..f5e480577 --- /dev/null +++ b/branch-4.5/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "5": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 4, 5, 18, 19, 21, 22, 23, 24, 25, 30, 31, 33, 35, 37, 38, 41], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 27, 28, 29, 30, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 27], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 30, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 26, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25, 26], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 26, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 19, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 26, 28, 29, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 26, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25, 26], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 27, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 28, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 26, 33], "user": [1, 2, 6, 7, 9, 27, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25, 26], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9], "refer": [1, 6, 9, 13], "upgrad": [1, 13], "lesson": [1, 9, 28, 29, 30], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25, 26], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 27, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 30, 32, 33, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 27, 31, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25, 26], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 28, 31, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 27, 30, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 12, 14, 19, 21, 22, 23, 24, 25, 26], "onc": [2, 12, 21, 25, 32, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 26, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 26, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 28, 31, 32, 38, 41], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 26, 28, 30, 31, 33, 35, 41], "both": [2, 5, 6, 12, 19, 22, 24, 25, 26, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 27, 39, 41], "updat": [2, 5, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 26, 29, 33, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25, 26], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25, 26], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 26, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 26, 28, 33, 34, 41], "advis": [2, 34, 41], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 26, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26], "databas": [2, 5, 7, 21, 30, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 33, 41], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 27, 31, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 27, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25, 26], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 14, 21, 22, 23, 24, 25, 26, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 12, 14, 16, 19, 21, 22, 24, 25, 26, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 26, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 12, 25], "yaml": [2, 5, 12, 17], "To": [2, 4, 5, 6, 12, 14, 17, 21, 22, 23, 24, 25, 26], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25, 26], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 28, 31, 33, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 26, 28, 29, 30, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "24": [2, 14, 25], "0": [2, 5, 6, 7, 8, 10, 14, 16, 17, 21, 22, 23, 24, 25, 26], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25, 26], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25, 26], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 14, 19, 22, 24, 25, 26], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 25, 34], "json": [2, 12, 14], "9": [2, 6, 16, 25], "3": [2, 4, 5, 6, 14, 16, 20, 35], "11": [2, 6, 16], "3000": [2, 5, 6, 22, 24, 25, 26], "1000": [2, 33], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 14, 29, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25, 26], "dir": [2, 7, 8, 22, 24, 25, 26], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 10, 12, 14, 16, 20, 24, 35], "7": [2, 5, 6, 14, 16], "3100": [2, 5], "rule": [2, 5, 7, 10, 19, 25, 32, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "42": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25, 26], "prom_rul": [2, 5, 12, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25, 26], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 26, 28, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 19, 21, 25], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 26, 30, 34, 35, 37, 39, 41], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 26, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 19, 21, 33, 39], "section": [4, 5, 6, 12, 19, 21, 24, 25, 26, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 19, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 30, 34, 35, 37, 41], "default": [4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 25, 31, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 19, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25, 26], "scrape": [4, 5, 6], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 38], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 28, 29, 30, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 19, 25, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 28, 30, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 25, 30, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 32, 39, 41], "need": [4, 5, 6, 7, 8, 12, 14, 19, 25, 28, 29, 30, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25, 26], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 26, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 28, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 28, 34, 41], "out": [4, 5, 6, 8, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 7, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25, 26], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 27, 30, 41], "take": [4, 5, 6, 7, 12, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25, 26], "help": [5, 7, 10, 14, 41], "pleas": [5, 19], "most": [5, 10, 14, 25, 36, 41], "common": [5, 7, 41], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 19], "standalon": [5, 19], "thei": [5, 6, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25, 26], "consolid": 5, "componen": 5, "suggest": [5, 14, 25], "those": [5, 25], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 28, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 30, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 26, 28, 29, 35, 41], "support": [5, 6, 14, 15, 27, 41], "want": [5, 6, 10, 22, 24, 25, 26], "latest": [5, 6, 7, 22, 24, 25, 26], "releas": [5, 21, 22, 23, 24, 25, 26], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25, 26], "http": [5, 6, 8, 19, 21, 22, 24, 25, 26, 30, 31, 38], "com": [5, 6, 22, 24, 25, 26, 30, 31, 38], "archiv": [5, 6, 22, 24, 25, 26], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25, 26], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 19, 21, 22, 23, 24, 26], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25, 26], "p": [5, 7, 8, 19, 21, 22, 24, 25, 26], "cd": [5, 6, 22, 24, 25, 26], "verifi": [5, 23], "point": [5, 6, 14, 22, 24, 25, 26], "browser": [5, 6, 8, 14, 19, 22, 24, 25, 26], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 26, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 26, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 32, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 12, 19, 25, 27, 30, 31, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 28, 31, 32, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 26, 30, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24, 26], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 12, 14, 27, 28, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25, 26], "scrap": [5, 7, 12], "job": [5, 6, 19], "onli": [5, 6, 7, 12, 19, 21, 23, 25, 30, 32, 33, 39, 41], "import": [5, 6, 7, 12, 21, 22, 24, 25, 26, 33], "record": [5, 7, 19, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25, 26], "code": [5, 34], "shell": 5, "correct": [5, 23, 41], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21], "host": [5, 6, 7, 9, 19], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23], "127": [5, 7, 19], "right": [5, 6, 14, 41], "typic": [5, 14, 25, 28, 30, 39, 41], "node_export": [5, 6, 7, 9, 16], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 31, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": [5, 18], "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 19, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7, 19], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25, 26], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 27, 32], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24, 26], "scylla_reactor_util": 5, "At": [5, 14, 24, 25, 26], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25, 26], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 28, 29, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 19, 25, 34, 38], "tabl": [5, 6, 10, 16, 27, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 26, 33, 41], "give": [5, 13, 15], "strongli": [5, 41], "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 27, 30, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 26, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 32, 33], "mention": [5, 14], "previous": [5, 24, 25, 26], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 31, 33, 41], "privileg": [5, 6, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 7, 25], "laptop": 6, "47": 6, "10": [6, 10, 14, 16], "44": 6, "8": [6, 16, 19, 21, 25], "41": 6, "38": 6, "34": 6, "32": 6, "29": 6, "25": [6, 19], "18": 6, "avoid": [6, 14, 19, 31, 41], "root": [6, 19, 22, 24, 25, 26], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 22, 24, 25, 26], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 30, 41], "higher": [6, 25, 30, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 27, 28, 29], "agent": [6, 7, 8, 9, 16, 19], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25, 26], "within": [6, 10, 14], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 38], "place": [6, 7, 8, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 28, 30, 31, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25, 26], "2019": [6, 16, 38], "reach": [6, 8, 12, 30, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 30, 31, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 29, 32, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 30, 31, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 27, 28, 29, 30, 31, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25, 26], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 34], "disk": [7, 10, 14, 19, 27, 29, 34], "possibl": [7, 10, 17, 41], "api": [7, 8, 21], "resolv": 7, "explicitli": [7, 14], "ca": 7, "optim": [7, 32, 38, 42], "drop": [7, 40, 41], "while": [7, 19, 21, 22, 24, 25, 26, 33], "cdc": 7, "request": [7, 17, 40], "how": [7, 8, 10, 14, 22, 24, 25, 26, 28, 29, 30, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 14, 19], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25, 26], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 26, 29], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 28, 29, 30, 34, 35, 41], "abov": [8, 22, 24, 25, 26], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 30, 38, 41], "email": [9, 10], "slack": [9, 10, 18], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11], "wrong": [10, 11, 14, 19, 25, 39, 41], "shown": [10, 19, 22, 24, 25, 26], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "sever": [10, 13, 15, 42], "annot": 10, "descript": [10, 34], "been": [10, 12], "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 41], "rout": [10, 30, 41], "repres": 10, "tree": 10, "win": [10, 19], "inhibit": 10, "mute": 10, "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 28], "simul": 10, "actual": [10, 37], "low": [10, 41], "space": 10, "lower": [10, 41], "fire": 10, "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 32, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "shard": [12, 19, 25, 34], "dd": 12, "non": [12, 19, 21, 29, 30, 34, 38, 41], "cost": [12, 41], "skip": [12, 25], "care": [12, 27, 28, 29, 41], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "explain": [14, 22, 24, 25, 26, 34], "intern": [14, 30, 41], "potenti": [14, 34, 41], "issu": [14, 19, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": [14, 25, 34, 35, 37], "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 31, 41], "tooltip": 14, "msresolut": 14, "share": [14, 33], "sort": [14, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 31, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 19, 23, 25], "calcul": [14, 19, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": 14, "usual": [14, 19, 34, 41], "easier": 14, "wrapper": 14, "re": [14, 30], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2023": 16, "2018": [16, 31], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "ask": 18, "question": 18, "discuss": 18, "forum": 18, "channel": 18, "56090": 19, "old": [19, 22, 23, 24, 25, 26], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "post": 19, "past": [19, 23], "mai": [19, 33, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": 19, "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 30, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 27, 28, 29, 31, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "dure": [19, 22, 24, 25, 26], "fallback": 19, "mechan": [19, 25, 28], "present": [19, 25], "newer": [19, 24, 25, 26], "reli": [19, 25, 41], "miss": [19, 25], "clean": 19, "recommend": [19, 22, 24, 25, 26, 41], "increas": [19, 31, 33, 41], "might": [19, 39], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25, 26], "migrat": [21, 22, 24, 26], "lose": 21, "histor": [21, 25], "process": [21, 33, 40], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25, 26], "3001": [21, 22, 24, 25, 26], "9091": [21, 22, 24, 25, 26], "9094": 21, "fail": [21, 28, 30, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25, 26], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25, 26], "back": [21, 28], "uninstal": [22, 24, 25, 26], "minor": [22, 24, 25, 26], "9095": [22, 24, 25, 26], "brows": [22, 24, 25, 26], "satisfi": [22, 24, 25, 26], "shut": [22, 24, 25, 26], "caus": [22, 24, 25, 26, 30, 41], "blackout": [22, 24, 25, 26], "normal": [22, 24, 25, 26], "oper": [22, 24, 25, 26, 34, 41], "complet": [22, 24, 25, 26], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25, 26], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 27, 34, 41], "ensur": 25, "patch": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 29], "latenc": [25, 30, 33, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 28], "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 28, 29, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "primari": [27, 41], "kei": [27, 41], "scan": 27, "These": [27, 41], "kind": [27, 41], "bigger": 27, "replicationfactor": [28, 29], "piec": 28, "determin": [28, 29, 35, 41], "repli": [28, 29, 31, 35, 37, 41], "unavail": [28, 41], "client": [28, 31, 34, 41], "respond": 28, "accompani": 28, "deep": 28, "understand": 28, "acknowledg": 29, "coordin": [29, 30, 35, 37, 41], "hint": 29, "fact": 29, "yet": 29, "ideal": [30, 41], "resourc": [30, 41], "replic": [30, 35, 37, 41], "prepar": [30, 34, 38], "statement": [30, 32, 34, 38], "balanc": [30, 33, 34, 41], "polici": 30, "cours": 30, "intro": 30, "recap": 30, "ring": [30, 41], "architectur": 30, "chunk": [31, 41], "overal": [31, 33, 41], "thu": 31, "www": [31, 38], "07": 31, "13": 31, "effici": [31, 41], "concret": 32, "thumb": 32, "alwai": 32, "favor": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "practic": [34, 38], "solv": 34, "categori": [34, 41], "jump": 34, "warn": 34, "cell": 34, "model": [34, 38, 40, 41], "awar": 34, "due": 34, "unsatisfi": 34, "faulti": 34, "cach": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "bottleneck": 38, "explan": 38, "08": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "shed": 40, "repair": 40, "que": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "prevent": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "order": 41, "BY": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 13, 26], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 34, 42], "us": [2, 5, 6, 8, 12, 14, 27, 28, 29, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25, 26], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25, 26], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25, 26], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 29, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 31, 38], "node": [6, 36], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": [6, 17], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25, 26], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 26, 34, 41], "all": [7, 22, 24, 25, 26, 28], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25, 26], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 28, 29, 35, 41], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 12, 14], "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25, 26], "modifi": 14, "limit": 14, "consist": [14, 28, 29, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25, 26], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25, 26], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25, 26], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25, 26], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25, 26], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "latenc": 19, "graph": 19, "ar": [19, 30, 31, 32, 38], "empti": 19, "reduc": 19, "total": 19, "number": 19, "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25, 26], "latest": 21, "new": [21, 22, 23, 24, 25, 26], "4": [21, 25, 26], "move": [21, 22, 24, 25, 26], "old": 21, "b": 21, "rollback": [21, 22, 23, 24, 25, 26], "link": [21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 38], "y": [22, 24, 25, 26], "": [22, 24, 25, 26], "i": [22, 24, 25, 26, 36], "run": [22, 24, 25, 26], "correct": [22, 24, 25, 26], "correctli": [22, 24, 26], "kill": [22, 24, 25, 26], "test": [24, 25, 26], "mode": [24, 25, 26], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "some": [27, 28, 29, 30, 31, 32, 35, 37], "allow": [27, 41], "filter": [27, 41], "univers": [28, 29, 30], "ani": 29, "token": [30, 41], "awar": [30, 41], "select": 31, "non": [31, 32], "page": [31, 41], "blog": [31, 38], "prepar": [32, 39, 41], "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "revers": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "Some queries are non-prepared": [[32, "some-queries-are-non-prepared"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Some queries are not token-aware": [[30, "some-queries-are-not-token-aware"]], "University link": [[30, "university-link"]], "Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "Some SELECT queries are non-paged": [[31, "some-select-queries-are-non-paged"]], "Blog-post Links": [[31, "blog-post-links"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "Some queries use Consistency Level: ANY": [[29, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[29, "link-to-scylla-university"], [28, "link-to-scylla-university"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Upgrade Procedure": [[22, "upgrade-procedure"], [23, "upgrade-procedure"], [24, "upgrade-procedure"], [26, "upgrade-procedure"], [25, "upgrade-procedure"], [21, "upgrade-procedure"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[22, "setting-the-server-s-files"], [24, "setting-the-server-s-files"], [26, "setting-the-server-s-files"], [25, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[22, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[22, "validate-the-version-installed-correctly"], [24, "validate-the-version-installed-correctly"], [26, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[22, "kill-all-containers"], [24, "kill-all-containers"], [26, "kill-all-containers"], [25, "kill-all-containers"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Related Links": [[22, "related-links"], [23, "related-links"], [24, "related-links"], [26, "related-links"], [25, "related-links"], [21, "related-links"]], "Some queries use Consistency Level: ALL": [[28, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[23, "install-the-new-monitoring-stack"], [21, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[23, "validate-the-upgrade"], [21, "validate-the-upgrade"]], "Rollback": [[23, "rollback"], [21, "rollback"]], "Some queries use ALLOW FILTERING": [[27, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Rollback to version 3.x": [[24, "rollback-to-version-3-x"], [25, "rollback-to-version-3-x"]], "Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y": [[26, "upgrade-guide-scylladb-monitoring-4-x-to-scylladb-monitoring-4-y"]], "Install 4.y (The new version)": [[26, "install-4-y-the-new-version"], [25, "install-4-y-the-new-version"]], "Killing the new 4.y Monitoring stack in testing mode": [[26, "killing-the-new-4-y-monitoring-stack-in-testing-mode"], [25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Move to version 4.y (the new version)": [[26, "move-to-version-4-y-the-new-version"], [25, "move-to-version-4-y-the-new-version"]], "Rollback to version 4.x": [[26, "rollback-to-version-4-x"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Migrating": [[25, "migrating"]], "Backup": [[25, "backup"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[19, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[17, "prometheus-api"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "System Overload": [[40, "system-overload"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Minimal Production System Recommendations": [[6, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[6, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[6, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "ScyllaDB Monitoring Stack": [[1, "scylladb-monitoring-stack"], [9, "scylladb-monitoring-stack"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "High Level Architecture": [[9, "high-level-architecture"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.5/sitemap.xml b/branch-4.5/sitemap.xml new file mode 100644 index 000000000..0decea30b --- /dev/null +++ b/branch-4.5/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.5/troubleshooting/index.html b/branch-4.5/troubleshooting/index.html new file mode 100644 index 000000000..7d1811d11 --- /dev/null +++ b/branch-4.5/troubleshooting/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Troubleshooting Guide for Scylla Monitoring Stack

                              +
                              +
                              +

                              Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/troubleshooting/monitor-troubleshoot.html b/branch-4.5/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..2cc6bd8f1 --- /dev/null +++ b/branch-4.5/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,901 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Troubleshoot Scylla Monitoring Stack

                              +

                              This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                              +
                              +

                              Problem

                              +
                              +

                              Scylla-Manager 2.2 with Duplicate information

                              +

                              Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                              +
                                +
                              • For Manager server: from 56090 to 5090

                              • +
                              • For Manager Agent: from 56090 to 5090

                              • +
                              +

                              For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                              +

                              However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                              +

                              The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                              +

                              Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                              +
                              +
                              +

                              A Container Fails To Start

                              +

                              When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                              +
                              Wait for Prometheus container to start........Error: Prometheus container failed to start
                              +
                              +
                              +

                              Should this happen, check the Docker logs for more information.

                              +
                              docker logs aprom
                              +
                              +
                              +

                              Usually the reason for the failure is described in the logs.

                              +
                              +
                              +

                              Files And Directory Permissions

                              +
                              +

                              Note

                              +

                              Avoid running Docker containers as root.

                              +
                              +

                              The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                              +

                              If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                              +
                              +

                              Note

                              +

                              If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                              +
                              +

                              For example if your Prometheus data directory is /prom-data and you are using centos user

                              +
                              ls -la /|grep prom-data
                              +
                              +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                              +
                              +sudo chown -R centos:centos /prom-data
                              +
                              +ls -la /|grep prom-data
                              +
                              +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                              +
                              +
                              +
                              +
                              +

                              No Data Points

                              +

                              No data points on all data charts.

                              +
                              +

                              Solution

                              +

                              If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                              +
                                +
                              1. Login to the Prometheus console:

                              2. +
                              3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                              4. +
                              5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                              6. +
                              +
                              +
                                +
                              • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                              • +
                              • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                              • +
                              • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                              • +
                              +
                              +

                              For example:

                              +
                              ./start-all.sh -v 3.1
                              +
                              +
                              +

                              More on start-all.sh options.

                              +
                              +
                              +
                              +

                              Grafana Chart Shows Error (!) Sign

                              +

                              Run this procedure on the Scylla Monitoring Stack server.

                              +

                              If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                              +
                              +

                              Solution

                              +

                              On the Scylla Monitoring Stack server:

                              +
                                +
                              1. Check Prometheus is running using docker ps.

                              2. +
                              +
                                +
                              • If it is not running check the prometheus.yml for errors.

                              • +
                              +

                              For example:

                              +
                              CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                              +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                              +
                              +
                              +
                                +
                              • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                              • +
                              +
                              +
                              +
                              +

                              Grafana Shows Server Level Metrics, but not Scylla Metrics

                              +

                              Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                              +
                              +

                              Solution

                              +
                                +
                              • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                              • +
                              +

                              For example

                              +
                              curl 172.17.0.2:9180/metrics
                              +
                              +
                              +
                              +
                              +
                              +

                              Grafana Shows Scylla Metrics, but not Server Level Metrics

                              +

                              Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                              +
                              +

                              Solution

                              +

                              1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                              +
                                +
                              1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                              2. +
                              +
                              +
                              +

                              Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                              +

                              While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                              +

                              If the node_exporter service is not starting it may need to be updated manually.

                              +

                              Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                              +
                              +
                              +
                              +

                              Latencies Graphs Are empty

                              +

                              Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                              +

                              During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                              +

                              Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                              +

                              If only the latency graphs are missing, it is because of missing recording rules.

                              +

                              This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                              +

                              If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                              +
                              +
                              +

                              Reducing the total number of metrics

                              +

                              In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                              +
                              +

                              Remove interrupts from node_exporter

                              +

                              By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                              +
                              +
                              +
                              +

                              Working with Wireshark

                              +

                              No metrics shown in the Scylla Monitoring Stack.

                              +
                                +
                              1. Install wireshark

                              2. +
                              +

                              2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                              +

                              For example:

                              +
                              tshark -i eth0 -f "dst port 9180"
                              +
                              +
                              +

                              Capture from Scylla node towards Scylla Monitoring Stack server.

                              +

                              In this example, Scylla is running.

                              +
                              Monitor ip        Scylla node ip
                              +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                              +
                              +
                              +

                              In this example, Scylla is not running

                              +
                              Monitor ip        Scylla node ip
                              +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                              +
                              +
                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/index.html b/branch-4.5/upgrade/index.html new file mode 100644 index 000000000..8e6780b23 --- /dev/null +++ b/branch-4.5/upgrade/index.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Scylla Monitoring Stack

                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..3444d087b --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,809 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                              +

                              Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                              +
                              +

                              Upgrade Procedure

                              +
                              +

                              1. Upgrade to the latest 1.x version

                              +

                              Before starting the upgrade procedure, make sure you are running the latest 1.x version

                              +
                              +
                              +

                              2. Install the new monitoring stack

                              +
                                +
                              1. Download the 2.x version from the release page.

                              2. +
                              3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                              4. +
                              5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                                +
                                  +
                                • scylla_servers.yml

                                • +
                                • scylla_manager_servers.yml

                                • +
                                • node_exporter_servers.yml

                                • +
                                +
                              6. +
                              7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                              8. +
                              +
                              ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                              +
                              +
                              +
                              +

                              Note

                              +

                              Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                              +
                              +

                              While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                              +
                              ./kill-all.sh -g 3001 -p 9091 -m 9094
                              +
                              +
                              +
                              +

                              Validation

                              +

                              Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                              +
                              +
                              +
                              +

                              3. Alerting Rules

                              +

                              Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                              +
                              +
                              +

                              4. Moving to Prometheus 2.x

                              +

                              Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                              +

                              Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                              +
                              +

                              a. Set the old system

                              +

                              The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                              +
                                +
                              • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                              • +
                              • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                              • +
                              +
                              +

                              Note

                              +

                              After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                              +
                              +
                              +
                              +

                              b. Set the new system

                              +

                              The following step will allow the new monitoring system to read historical metrics from the old system.

                              +
                                +
                              • In the Prometheus prometheus.yml.template file add the following at the end:

                              • +
                              +
                              remote_read:
                              +  - url: "http://{ip}:9111/api/v1/read"
                              +
                              +
                              +

                              Where {ip} is the ip of the old system.

                              +
                                +
                              • restart the new stack

                              • +
                              +
                              +
                              +
                              +

                              Validate the upgrade

                              +

                              You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                              +
                              +
                              +
                              +

                              Rollback

                              +

                              In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..190c2318a --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,803 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                              +
                              +

                              Upgrade Procedure

                              +

                              We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                              +

                              Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                              +
                              +

                              Install 2.y (The new version)

                              +
                              wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                              +unzip scylla-monitoring-2.y.zip
                              +cd scylla-monitoring-scylla-monitoring-2.y/
                              +
                              +
                              +

                              Replace “y” with the new minor release number, for example, 2.1.zip

                              +
                              +
                              +

                              Setting the server’s files

                              +

                              Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                              +
                              cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                              +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                              +
                              +
                              +
                              +
                              +

                              Validate the new version is running the correct version

                              +

                              Starting from Scylla-Monitoring version 2.2, you can run:

                              +
                              ./start-all.sh --version
                              +
                              +
                              +

                              To validate the Scylla-Monitoring version.

                              +
                              +
                              +

                              Validate the version installed correctly

                              +

                              To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                              +
                              ./start-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              Browse to http://{ip}:9091 +And check the Grafana dashboard

                              +

                              Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                              +
                              +

                              Caution

                              +

                              Important: do not use the local dir flag when testing!

                              +
                              +

                              When you are satisfied with the data in the dashboard, you can shut down the containers.

                              +
                              +

                              Caution

                              +

                              Important: Do not kill the 2.x version that is currently running.

                              +
                              +

                              Use the following command to kill the containers:

                              +
                              ./kill-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              You can start and stop the new 2.y version while testing.

                              +
                              +
                              +

                              Move to version 2.y (the new version)

                              +

                              Note: migrating will cause a few seconds of blackout in the system.

                              +

                              We assume that you are using external volume to store the metrics data.

                              +
                              +

                              Kill all containers

                              +

                              Follow the instruction on how to kill the 2.y version when in testing mode.

                              +

                              To kill the 2.x version containers, run:

                              +
                              ./kill-all.sh
                              +
                              +
                              +

                              Start version 2.y in normal mode

                              +

                              From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                              +
                              ./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +

                              Point your browser to http://{ip}:3000 and see that the data is there.

                              +
                              +
                              +
                              +

                              Rollback to version 2.x

                              +

                              To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                              +

                              To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                              +
                              ./kill-all.sh
                              +cd /path/to/scylla-grafana-2.x/
                              +./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +
                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..5fb7925a7 --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,767 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                              +

                              Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                              +
                              +

                              Upgrade Procedure

                              +
                              +

                              1. Validate node_exporter version

                              +

                              Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                              +

                              If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                              +
                              +
                              +

                              2. Install the new monitoring stack

                              +
                                +
                              1. Download the 3.x version from the release page.

                              2. +
                              3. Unzip it into a different directory.

                              4. +
                              5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                                +
                                  +
                                • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                                • +
                                • scylla_manager_servers.yml

                                • +
                                +
                                +
                                +

                                Note

                                +

                                The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                                +
                                +
                                +
                              6. +
                              7. Stop the old monitoring stack

                                +
                                +
                                ./kill-all.sh
                                +
                                +
                                +
                                +
                              8. +
                              9. Start the new monitoring stack

                                +
                                +
                                ./start-all.sh -d /prometheus-data-path
                                +
                                +
                                +
                                +
                              10. +
                              +
                              +
                              +

                              Validate the upgrade

                              +

                              You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                              +

                              Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                              +
                              +
                              +
                              +

                              Rollback

                              +

                              To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..8a4951ffd --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                              +
                              +

                              Upgrade Procedure

                              +

                              We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                              +

                              Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                              +
                              +

                              Install 3.y (The new version)

                              +
                              wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                              +unzip scylla-monitoring-3.y.zip
                              +cd scylla-monitoring-scylla-monitoring-3.y/
                              +
                              +
                              +

                              Replace “y” with the new minor release number, for example, 3.0.1.zip

                              +
                              +
                              +

                              Setting the server’s files

                              +

                              Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                              +
                              cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                              +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                              +
                              +
                              +
                              +
                              +

                              Validate the new version is running the correct version

                              +

                              Starting from Scylla-Monitoring version 2.2, you can run:

                              +
                              ./start-all.sh --version
                              +
                              +
                              +

                              To validate the Scylla-Monitoring version.

                              +
                              +
                              +

                              Validate the version installed correctly

                              +

                              To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                              +
                              ./start-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              Browse to http://{ip}:9091 +And check the Grafana dashboard

                              +

                              Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                              +
                              +

                              Caution

                              +

                              Important: do not use the local dir flag when testing!

                              +
                              +

                              When you are satisfied with the data in the dashboard, you can shut down the containers.

                              +
                              +

                              Caution

                              +

                              Important: Do not kill the 3.x version that is currently running.

                              +
                              +
                              +
                              +

                              Killing the new 3.y Monitoring stack in testing mode

                              +

                              Use the following command to kill the containers:

                              +
                              ./kill-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              You can start and stop the new 3.y version while testing.

                              +
                              +
                              +

                              Move to version 3.y (the new version)

                              +

                              Note: migrating will cause a few seconds of blackout in the system.

                              +

                              We assume that you are using external volume to store the metrics data.

                              +
                              +

                              Kill all containers

                              +

                              At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                              +

                              Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                              +

                              kill the older 3.x version containers by running:

                              +
                              ./kill-all.sh
                              +
                              +
                              +

                              Start version 3.y in normal mode

                              +

                              From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                              +
                              ./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +

                              Point your browser to http://{ip}:3000 and see that the data is there.

                              +
                              +
                              +
                              +

                              Rollback to version 3.x

                              +

                              To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                              +

                              To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                              +
                              ./kill-all.sh
                              +cd /path/to/scylla-grafana-3.x/
                              +./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +
                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..8f48eda50 --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,954 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                              +
                              +

                              Upgrade Procedure

                              +

                              We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                              +

                              Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                              +
                              +

                              Install 4.y (The new version)

                              +
                              wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                              +unzip scylla-monitoring-4.y.zip
                              +cd scylla-monitoring-scylla-monitoring-4.y/
                              +
                              +
                              +

                              Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                              +
                              +
                              +

                              Setting the server’s files

                              +

                              Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                              +
                              cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                              +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                              +
                              +
                              +
                              +
                              +

                              Validate the new version is running the correct version

                              +

                              run:

                              +
                              ./start-all.sh --version
                              +
                              +
                              +

                              To validate the Scylla-Monitoring version.

                              +
                              +
                              +
                              +

                              Running in test mode

                              +

                              This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                              +
                              +

                              Running second monitoring stack

                              +

                              We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                              +
                              ./start-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              Browse to http://{ip}:9091 and check the Grafana dashboard.

                              +

                              Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                              +
                              +

                              Caution

                              +

                              Important: do not use the local dir flag when testing!

                              +
                              +

                              When you are satisfied with the data in the dashboard, you can shut down the containers.

                              +
                              +

                              Caution

                              +

                              Important: Do not kill the 3.x version that is currently running!

                              +
                              +
                              +
                              +

                              Killing the new 4.y Monitoring stack in testing mode

                              +

                              Use the following command to kill the containers:

                              +
                              ./kill-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              You can start and stop the new 4.y version while testing.

                              +
                              +
                              +
                              +

                              Migrating

                              +
                              +

                              Move to version 4.y (the new version)

                              +

                              Note: migrating will cause a few seconds of blackout in the system.

                              +

                              We assume that you are using external volume to store the metrics data.

                              +
                              +

                              Backup

                              +

                              We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                              +
                              +
                              +

                              Kill all containers

                              +

                              At this point you have two monitoring stacks installed with the older version running.

                              +

                              If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                              +

                              kill the older 3.x version containers by running:

                              +
                              ./kill-all.sh
                              +
                              +
                              +

                              Start version 4.y in normal mode

                              +

                              From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                              +
                              ./start-all.sh -d /path/to/copy/data/dir
                              +
                              +
                              +

                              Point your browser to http://{ip}:3000 and see that the data is there.

                              +
                              +
                              +
                              +

                              Rollback to version 3.x

                              +

                              To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                              +

                              To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                              +
                              ./kill-all.sh
                              +cd /path/to/scylla-grafana-3.x/
                              +./start-all.sh -d /path/to/original/data/dir
                              +
                              +
                              +
                              +
                              +
                              +

                              Post-installation: Metrics back-filling

                              +

                              Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                              +

                              For example, this is a recording rule that calculates the p99 write latency:

                              +
                              - record: wlatencyp99
                              +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                              +  labels:
                              +    by: "instance,shard"
                              +
                              +
                              +

                              For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                              +

                              Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                              +
                              +
                              +

                              Note

                              +

                              If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                              +
                              +
                              +
                              +../_images/before-backfilling.png +
                              +

                              This is an example of missing latency graph

                              +
                              +
                              +

                              The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                              +

                              For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                              +

                              In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                              +

                              The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                              +
                              +

                              Determine the backfilling period

                              +

                              When you run the backfilling process you need to determine the start time and end time.

                              +
                              +

                              Determine the start time

                              +

                              The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                              +

                              If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                              +

                              For the rest of this example, we will assume that your retention time is 360 days.

                              +
                              +
                              +

                              Determine the end time

                              +

                              Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                              +

                              If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                              +

                              That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                              +

                              The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                              +
                              +
                              +
                              +

                              Backfilling Process

                              +
                              +

                              backup

                              +

                              If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                              +

                              To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                              +
                              +
                              +

                              Restart the monitoring stack

                              +

                              You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                              +

                              -b "--storage.tsdb.allow-overlapping-blocks"

                              +
                              +
                              +

                              Create the data files

                              +

                              We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                              +

                              The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                              +

                              Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                              +
                              docker exec -it aprom sh
                              +cd /prometheus/data/
                              +promtool tsdb create-blocks-from rules \
                              +--start $start \
                              +--end $end \
                              +--url http://localhost:9090 \
                              +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                              +
                              +
                              +

                              It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                              +
                              +
                              +

                              Note

                              +

                              Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                              +
                              +
                              +
                              +
                              +

                              Copy the data files

                              +

                              Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                              +

                              Copy the data files to the Prometheus directory:

                              +
                              cp data/* .
                              +
                              +
                              +

                              The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                              +

                              Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                              +
                              +../_images/after-backfilling.jpg +
                              +

                              Un example: after loading half of the data

                              +
                              +
                              +
                              +
                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..af4ccc76c --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,812 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x to 4.y, for example, between 4.0 to 4.0.1.

                              +
                              +

                              Upgrade Procedure

                              +

                              We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                              +

                              Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                              +
                              +

                              Install 4.y (The new version)

                              +
                              wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                              +unzip scylla-monitoring-4.y.zip
                              +cd scylla-monitoring-scylla-monitoring-4.y/
                              +
                              +
                              +

                              Replace “y” with the new minor release number, for example, 4.0.1.zip

                              +
                              +
                              +

                              Setting the server’s files

                              +

                              Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                              +
                              cp /path/to/monitoring/4.x/prometheus/scylla_servers.yml prometheus/
                              +cp /path/to/monitoring/4.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                              +
                              +
                              +
                              +
                              +

                              Validate the new version is running the correct version

                              +

                              Run:

                              +
                              ./start-all.sh --version
                              +
                              +
                              +

                              To validate the Scylla-Monitoring version.

                              +
                              +
                              +

                              Validate the version installed correctly

                              +

                              To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x) stack.

                              +
                              ./start-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              Browse to http://{ip}:9091 +And check the Grafana dashboard

                              +

                              Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                              +
                              +

                              Caution

                              +

                              Important: do not use the local dir flag when testing!

                              +
                              +

                              When you are satisfied with the data in the dashboard, you can shut down the containers.

                              +
                              +

                              Caution

                              +

                              Important: Do not kill the 4.x version that is currently running.

                              +
                              +
                              +
                              +

                              Killing the new 4.y Monitoring stack in testing mode

                              +

                              Use the following command to kill the containers:

                              +
                              ./kill-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              You can start and stop the new 4.y version while testing.

                              +
                              +
                              +

                              Move to version 4.y (the new version)

                              +

                              Note: migrating will cause a few seconds of blackout in the system.

                              +

                              We assume that you are using external volume to store the metrics data.

                              +
                              +

                              Kill all containers

                              +

                              At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                              +

                              Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section

                              +

                              kill the older 4.x version containers by running:

                              +
                              ./kill-all.sh
                              +
                              +
                              +

                              Start version 4.y in normal mode

                              +

                              From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                              +
                              ./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +

                              Point your browser to http://{ip}:3000 and see that the data is there.

                              +
                              +
                              +
                              +

                              Rollback to version 4.x

                              +

                              To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                              +

                              To rollback to version 4.x after you completed the moving to version 4.y (as shown above). +Run:

                              +
                              ./kill-all.sh
                              +cd /path/to/scylla-grafana-4.x/
                              +./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +
                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.5/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..d2852f247 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some queries use ALLOW FILTERING

                              +

                              Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                              +

                              These kinds of queries can create a bigger load on Scylla, and should be used with care.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlCLAll.html b/branch-4.5/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..d54ff8ac1 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some queries use Consistency Level: ALL

                              +

                              Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                              +

                              Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                              +

                              Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlCLAny.html b/branch-4.5/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..028af1a78 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some queries use Consistency Level: ANY

                              +

                              Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                              +

                              Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.5/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..7dba3ae50 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some queries are not token-aware

                              +

                              Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                              +

                              Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlNonPaged.html b/branch-4.5/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..75aae2564 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some SELECT queries are non-paged

                              +

                              By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                              +
                              +

                              Blog-post Links

                              +

                              https://www.scylladb.com/2018/07/13/efficient-query-paging/

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.5/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..a747e8601 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some queries are non-prepared

                              +

                              Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/heavyCompaction.html b/branch-4.5/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..bb4761357 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,706 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Compaction takes lots of memory and CPU

                              +

                              ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                              +

                              If this is the case, you can do one of the following:

                              +
                                +
                              • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                                +
                                +
                                  +
                                • In the scylla.yml configuration file: compaction_static_shares: 100

                                • +
                                • In the command line when starting ScyllaDB: --compaction-static-shares 100

                                • +
                                +
                                +

                                You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                                +
                              • +
                              • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                              • +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/index.html b/branch-4.5/use-monitoring/advisor/index.html new file mode 100644 index 000000000..6a121a6c4 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/index.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Stack Advisor

                              +
                              +
                              +

                              The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                              +
                              +

                              The Advisor section

                              +
                              +../../_images/advisor_panel.png +
                              +

                              The Advisor section

                              +
                              +
                              +

                              The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                              +

                              For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                              +

                              Each Advisor issue is explained in detail:

                              + +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/nodeCLErrors.html b/branch-4.5/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..6cf0ac81e --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Some operation failed due to unsatisfied consistency level

                              +

                              ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                              +

                              For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                              +

                              When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/nodeIOErrors.html b/branch-4.5/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..fe60b2412 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              I/O Errors can indicate a node with a faulty disk

                              +

                              I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.5/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..66c368cc2 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Some operations failed on the replica side

                              +

                              ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                              +

                              An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.5/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..fe2e46f85 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              CQL queries are not balanced among shards

                              +

                              For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                              +

                              There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                              +
                              +

                              Blog post link

                              +

                              https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.5/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..ba9b42b52 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Prepared statements cache eviction

                              +

                              Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                              +
                                +
                              • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                              • +
                              • The prepared statements cache might be too small for the number of prepared statements.

                              • +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/systemOverload.html b/branch-4.5/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..69bd21ba3 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              System Overload

                              +

                              There could be multiple indications that a system is overloaded:

                              +
                                +
                              • Timeouts

                              • +
                              • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                              • +
                              • CPU at 100% when no background process (like compaction or repair) runs.

                              • +
                              • Ques are getting filled.

                              • +
                              +

                              If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/cql-optimization.html b/branch-4.5/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..313fb48eb --- /dev/null +++ b/branch-4.5/use-monitoring/cql-optimization.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              The CQL Optimization

                              +

                              The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                              +
                              +../_images/cql_optimization_master.png +
                              +

                              The CQL Dashboard

                              +
                              +
                              +

                              The upper part of the dashboard holds CQL related metrics.

                              +

                              The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                              +
                              +

                              Note

                              +

                              Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                              +
                              +

                              The following sections describe each of the dashboard’s panel

                              +
                              +

                              Prepared Statements

                              +

                              Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                              +

                              Using prepared statements has the following benefits:

                              +
                                +
                              • The database only needs to parse the query once

                              • +
                              • The driver can route the query to the right node

                              • +
                              • Using place-holders and values is safer and prevents CQL-Injection

                              • +
                              +

                              The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                              +

                              The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                              +
                              +
                              +

                              Token Aware

                              +

                              Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                              +

                              Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                              +

                              The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                              +

                              The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                              +
                              +
                              +

                              Paged Queries

                              +

                              By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                              +

                              The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                              +

                              The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                              +
                              +
                              +

                              Reversed CQL Reads

                              +

                              ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                              +

                              We strongly recommend using use the correct ordering. +Querying with an order different than the order the CLUSTERING ORDER BY was defined is supported, but not advisable.

                              +

                              For example, look at the following table:

                              +
                              CREATE TABLE ks1.table_demo (
                              +   category text,
                              +   type int,
                              +   PRIMARY KEY (category, type))
                              +WITH CLUSTERING ORDER BY (type DESC);
                              +
                              +
                              +

                              The following query uses reverse order:

                              +
                              select * from ks1.table_demo where category='cat1' order by type ASC;
                              +
                              +
                              +

                              The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                              +

                              The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                              +
                              +
                              +

                              ALLOW FILTERING

                              +

                              Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                              +

                              These kinds of queries can create a big load on the system, and should be used with care.

                              +

                              The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                              +

                              The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                              +

                              The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                              +

                              The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                              +

                              The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                              +
                              +
                              +

                              Consistency Level

                              +

                              Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                              +

                              The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                              +

                              Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                              +

                              The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                              +

                              The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                              +

                              The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                              +

                              The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                              +
                              +
                              +

                              Cross DC

                              +

                              Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                              +
                              +
                              +

                              Cross DC Consistency Level

                              +

                              Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                              +
                              +
                              +

                              Cross DC read requests

                              +
                              +

                              Note

                              +

                              The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                              +
                              +

                              In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                              +

                              The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/index.html b/branch-4.5/use-monitoring/index.html new file mode 100644 index 000000000..623ad252c --- /dev/null +++ b/branch-4.5/use-monitoring/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Using Scylla Monitoring Stack

                              +
                              +
                              +

                              There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.6/.buildinfo b/branch-4.6/.buildinfo new file mode 100644 index 000000000..9d9c7535f --- /dev/null +++ b/branch-4.6/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 8fbbf7e7af20052cb52df0f88aeeee5d +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.6/.doctrees/common/monitor-description.doctree b/branch-4.6/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..7fdb32931 Binary files /dev/null and b/branch-4.6/.doctrees/common/monitor-description.doctree differ diff --git a/branch-4.6/.doctrees/environment.pickle b/branch-4.6/.doctrees/environment.pickle new file mode 100644 index 000000000..32d278a96 Binary files /dev/null and b/branch-4.6/.doctrees/environment.pickle differ diff --git a/branch-4.6/.doctrees/index.doctree b/branch-4.6/.doctrees/index.doctree new file mode 100644 index 000000000..87827ff22 Binary files /dev/null and b/branch-4.6/.doctrees/index.doctree differ diff --git a/branch-4.6/.doctrees/install/docker-compose.doctree b/branch-4.6/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..1d12dfad9 Binary files /dev/null and b/branch-4.6/.doctrees/install/docker-compose.doctree differ diff --git a/branch-4.6/.doctrees/install/index.doctree b/branch-4.6/.doctrees/install/index.doctree new file mode 100644 index 000000000..82dc8bdb1 Binary files /dev/null and b/branch-4.6/.doctrees/install/index.doctree differ diff --git a/branch-4.6/.doctrees/install/min-prod-hw.doctree b/branch-4.6/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..9f16ffa3e Binary files /dev/null and b/branch-4.6/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.6/.doctrees/install/monitor-without-docker.doctree b/branch-4.6/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..eb17c0a0b Binary files /dev/null and b/branch-4.6/.doctrees/install/monitor-without-docker.doctree differ diff --git a/branch-4.6/.doctrees/install/monitoring-stack.doctree b/branch-4.6/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..be809074c Binary files /dev/null and b/branch-4.6/.doctrees/install/monitoring-stack.doctree differ diff --git a/branch-4.6/.doctrees/install/start-all.doctree b/branch-4.6/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..e6b863c6c Binary files /dev/null and b/branch-4.6/.doctrees/install/start-all.doctree differ diff --git a/branch-4.6/.doctrees/install/thanos.doctree b/branch-4.6/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..67407519b Binary files /dev/null and b/branch-4.6/.doctrees/install/thanos.doctree differ diff --git a/branch-4.6/.doctrees/intro.doctree b/branch-4.6/.doctrees/intro.doctree new file mode 100644 index 000000000..8711837c3 Binary files /dev/null and b/branch-4.6/.doctrees/intro.doctree differ diff --git a/branch-4.6/.doctrees/procedures/alerts/alerting.doctree b/branch-4.6/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..0675e046c Binary files /dev/null and b/branch-4.6/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.6/.doctrees/procedures/alerts/index.doctree b/branch-4.6/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..7e555f8b3 Binary files /dev/null and b/branch-4.6/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.6/.doctrees/procedures/datadog/index.doctree b/branch-4.6/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..6b3720c64 Binary files /dev/null and b/branch-4.6/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.6/.doctrees/procedures/index.doctree b/branch-4.6/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..aaca68f9a Binary files /dev/null and b/branch-4.6/.doctrees/procedures/index.doctree differ diff --git a/branch-4.6/.doctrees/procedures/updating-dashboard.doctree b/branch-4.6/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..1917a59d3 Binary files /dev/null and b/branch-4.6/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/branch-4.6/.doctrees/reference/index.doctree b/branch-4.6/.doctrees/reference/index.doctree new file mode 100644 index 000000000..7d03aa26c Binary files /dev/null and b/branch-4.6/.doctrees/reference/index.doctree differ diff --git a/branch-4.6/.doctrees/reference/matrix.doctree b/branch-4.6/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..26cc14ff4 Binary files /dev/null and b/branch-4.6/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.6/.doctrees/reference/monitoring-apis.doctree b/branch-4.6/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..3a0392847 Binary files /dev/null and b/branch-4.6/.doctrees/reference/monitoring-apis.doctree differ diff --git a/branch-4.6/.doctrees/troubleshooting/index.doctree b/branch-4.6/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..310201416 Binary files /dev/null and b/branch-4.6/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.6/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/branch-4.6/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..6c8adede5 Binary files /dev/null and b/branch-4.6/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/index.doctree b/branch-4.6/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..927c95d56 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..143fc08d4 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..6dc0055c9 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..7a32d2bea Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..cd3ee1cf7 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..8d4e4214b Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..e5de4b199 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..7fbb89893 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..b65cca5e7 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..283d505d3 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..c9059ca53 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..acb9537f0 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..ec53b6d53 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..0ba33e039 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..5c91fb22e Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..9495a5924 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..bfd392cfa Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..9d3ad2a56 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..8903f9767 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..cab7d3458 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..085b8c3dd Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/cql-optimization.doctree b/branch-4.6/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..ef77df8c8 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/index.doctree b/branch-4.6/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..775a171e5 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.6/.nojekyll b/branch-4.6/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.6/404.html b/branch-4.6/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.6/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                              +

                              404

                              +

                              The ScyllaDB monster ate your page!

                              +

                              + Home +

                              +
                              + + + \ No newline at end of file diff --git a/branch-4.6/CNAME b/branch-4.6/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.6/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.6/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.6/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..3e85b60ab --- /dev/null +++ b/branch-4.6/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,576 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" diff --git a/branch-4.6/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.6/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.6/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.6/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.6/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/branch-4.6/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.6/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.6/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/branch-4.6/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.6/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/branch-4.6/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/branch-4.6/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/branch-4.6/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.6/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/branch-4.6/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.6/_images/1.png b/branch-4.6/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.6/_images/1.png differ diff --git a/branch-4.6/_images/2.png b/branch-4.6/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.6/_images/2.png differ diff --git a/branch-4.6/_images/3.png b/branch-4.6/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.6/_images/3.png differ diff --git a/branch-4.6/_images/advisor_panel.png b/branch-4.6/_images/advisor_panel.png new file mode 100644 index 000000000..89b9a5950 Binary files /dev/null and b/branch-4.6/_images/advisor_panel.png differ diff --git a/branch-4.6/_images/after-backfilling.jpg b/branch-4.6/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.6/_images/after-backfilling.jpg differ diff --git a/branch-4.6/_images/alertmanager.png b/branch-4.6/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.6/_images/alertmanager.png differ diff --git a/branch-4.6/_images/before-backfilling.png b/branch-4.6/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.6/_images/before-backfilling.png differ diff --git a/branch-4.6/_images/cql_optimization_master.png b/branch-4.6/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.6/_images/cql_optimization_master.png differ diff --git a/branch-4.6/_images/datadog.png b/branch-4.6/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.6/_images/datadog.png differ diff --git a/branch-4.6/_images/grafana.png b/branch-4.6/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.6/_images/grafana.png differ diff --git a/branch-4.6/_images/monitor.png b/branch-4.6/_images/monitor.png new file mode 100644 index 000000000..cf691ecb3 Binary files /dev/null and b/branch-4.6/_images/monitor.png differ diff --git a/branch-4.6/_images/monitoring_stack.png b/branch-4.6/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.6/_images/monitoring_stack.png differ diff --git a/branch-4.6/_images/monitoring_stack1.png b/branch-4.6/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.6/_images/monitoring_stack1.png differ diff --git a/branch-4.6/_sources/common/monitor-description.rst.txt b/branch-4.6/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.6/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.6/_sources/index.rst.txt b/branch-4.6/_sources/index.rst.txt new file mode 100644 index 000000000..3dbe94edd --- /dev/null +++ b/branch-4.6/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.6/_sources/install/docker-compose.rst.txt b/branch-4.6/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.6/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.6/_sources/install/index.rst.txt b/branch-4.6/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/branch-4.6/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.6/_sources/install/min-prod-hw.rst.txt b/branch-4.6/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/branch-4.6/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                              + + + + + + + + + + + +
                              # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                              00
                              + +
                              + \ No newline at end of file diff --git a/branch-4.6/_sources/install/monitor-without-docker.rst.txt b/branch-4.6/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..02cdaef2e --- /dev/null +++ b/branch-4.6/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                              `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configuration`_. + +.. _`grafana configuration`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.6/_sources/install/monitoring-stack.rst.txt b/branch-4.6/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..5843f351a --- /dev/null +++ b/branch-4.6/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,412 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                              `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.6 + - 2.48.1 + - 10.2.2 + * - 4.5 + - 2.47.1 + - 10.1.5 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.6/_sources/install/start-all.rst.txt b/branch-4.6/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..f270d092f --- /dev/null +++ b/branch-4.6/_sources/install/start-all.rst.txt @@ -0,0 +1,107 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +**--compose** This is an experimental option. When set, it initiates a two-stage process. Firstly, a ``docker-compose.yml`` file is created along with an ``.env`` file. Following this, the script executes ``docker-compose up``. Please note that having docker-compose is a prerequisite. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.6/_sources/install/thanos.rst.txt b/branch-4.6/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.6/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.6/_sources/intro.rst.txt b/branch-4.6/_sources/intro.rst.txt new file mode 100644 index 000000000..78481f6c3 --- /dev/null +++ b/branch-4.6/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.6/_sources/procedures/alerts/alerting.rst.txt b/branch-4.6/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..d196123bc --- /dev/null +++ b/branch-4.6/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,114 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in files placed under `prometheus/prom_rules/`. Prometheus will load any file that ends with `yml` or `yaml`. + +Each Prometheus alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "error" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **error**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alerts severity +--------------- + +Prometheus uses the following severities from low to high: **info**, **warn**, **error**, **critical**. + +The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the **error** alert for disk-full is firing, it silences the **warn** alert. + +When adding your own alerts, you can use the severities to signal the action's importance, for example **critical** would be a pager-duty, while an **error** will be an email. + +Adding Alerts +---------------- + +Add your own alerts in a separate file with a **yml** or **yaml** extension. Making it easier during upgrade. + +Modifying Alerts +---------------- + +It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.6/_sources/procedures/alerts/index.rst.txt b/branch-4.6/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.6/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.6/_sources/procedures/datadog/index.rst.txt b/branch-4.6/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bcc4e9b7 --- /dev/null +++ b/branch-4.6/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,68 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Non Scylla Cloud users, download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Cloud users, skip this step, it's been take care for by the cloud. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.6/_sources/procedures/index.rst.txt b/branch-4.6/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..76a24002a --- /dev/null +++ b/branch-4.6/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.6/_sources/procedures/updating-dashboard.rst.txt b/branch-4.6/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.6/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.6/_sources/reference/index.rst.txt b/branch-4.6/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/branch-4.6/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.6/_sources/reference/matrix.rst.txt b/branch-4.6/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..c5e722bbf --- /dev/null +++ b/branch-4.6/_sources/reference/matrix.rst.txt @@ -0,0 +1,160 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.6 + - 5.2, 5.4 + - 2021.1, 2022.1, 2022.2, 2023.1, 2024.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.6/_sources/reference/monitoring-apis.rst.txt b/branch-4.6/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/branch-4.6/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.6/_sources/troubleshooting/index.rst.txt b/branch-4.6/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..fa1b25a10 --- /dev/null +++ b/branch-4.6/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,16 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* You can ask questions and discuss the ScyllaDB Monitoring Stack in the `ScyllaDB community forum `_ and on the `Slack channel `_. \ No newline at end of file diff --git a/branch-4.6/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/branch-4.6/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/branch-4.6/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.6/_sources/upgrade/index.rst.txt b/branch-4.6/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/branch-4.6/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                              +
                              +
                              +
                              Upgrade Scylla Open Source
                              +
                              +
                              + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                              +
                              +
                              diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..95cec1d4e --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,150 @@ +====================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b +====================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y.b (The new version) +------------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip + unzip scylla-monitoring-4.y.b.zip + cd scylla-monitoring-scylla-monitoring-4.y.b/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the target files ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the port numbers +^^^^^^^^^^^^^^^^^^^^^^^^^ +ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent. + +Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target. + +.. caution:: + + As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics. + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x.a version that is currently running. + +Killing the new 4.y.b Monitoring stack in testing mode +------------------------------------------------------ + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y.b version while testing. + +Move to version 4.y.b (the new version) +--------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y.b Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x.a version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y.b in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y.b` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x.a +------------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y.b Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x.a/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..f86568a31 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,11 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.6/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.6/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..06fc98c5f --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,37 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.6/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.6/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.6/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.6/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.6/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.6/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..ac0b7d62f --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Queues are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.6/_sources/use-monitoring/cql-optimization.rst.txt b/branch-4.6/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..7ac8b2284 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,155 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +We strongly recommend using use the correct ordering. +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is supported, but not advisable. + + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.6/_sources/use-monitoring/index.rst.txt b/branch-4.6/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.6/_static/basic.css b/branch-4.6/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.6/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.6/_static/check-solid.svg b/branch-4.6/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.6/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.6/_static/clipboard.min.js b/branch-4.6/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.6/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.6/_static/copybutton.css b/branch-4.6/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.6/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                              Short

                              + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.6/_static/copybutton.js b/branch-4.6/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.6/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.6/_static/copybutton_funcs.js b/branch-4.6/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.6/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.6/_static/css/main.css b/branch-4.6/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-4.6/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.6/_static/doctools.js b/branch-4.6/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.6/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.6/_static/documentation_options.js b/branch-4.6/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.6/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.6/_static/file.png b/branch-4.6/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.6/_static/file.png differ diff --git a/branch-4.6/_static/img/banner-background.svg b/branch-4.6/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.6/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.6/_static/img/favicon-228x228.png b/branch-4.6/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.6/_static/img/favicon-228x228.png differ diff --git a/branch-4.6/_static/img/favicon-32x32.png b/branch-4.6/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.6/_static/img/favicon-32x32.png differ diff --git a/branch-4.6/_static/img/favicon.ico b/branch-4.6/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.6/_static/img/favicon.ico differ diff --git a/branch-4.6/_static/img/icons/icon-about-team.svg b/branch-4.6/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.6/_static/img/icons/icon-about-us-m.svg b/branch-4.6/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-about-us.svg b/branch-4.6/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-alternator.svg b/branch-4.6/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-apps.svg b/branch-4.6/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-architecture.svg b/branch-4.6/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.6/_static/img/icons/icon-benchmarks.svg b/branch-4.6/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.6/_static/img/icons/icon-blog.svg b/branch-4.6/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.6/_static/img/icons/icon-careers.svg b/branch-4.6/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.6/_static/img/icons/icon-chevron-left.svg b/branch-4.6/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.6/_static/img/icons/icon-chevron-right.svg b/branch-4.6/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.6/_static/img/icons/icon-circe.svg b/branch-4.6/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-clock.svg b/branch-4.6/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-close.svg b/branch-4.6/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-cloud-docs.svg b/branch-4.6/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-cloud.svg b/branch-4.6/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-comparison.svg b/branch-4.6/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.6/_static/img/icons/icon-contact-us.svg b/branch-4.6/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.6/_static/img/icons/icon-developers-blog.svg b/branch-4.6/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.6/_static/img/icons/icon-docs.svg b/branch-4.6/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.6/_static/img/icons/icon-enterprise-m.svg b/branch-4.6/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-enterprise.svg b/branch-4.6/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-events.svg b/branch-4.6/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.6/_static/img/icons/icon-exclamation.svg b/branch-4.6/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-expand.svg b/branch-4.6/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-forum.svg b/branch-4.6/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-getting-started.svg b/branch-4.6/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-glossary.svg b/branch-4.6/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-home.svg b/branch-4.6/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-infoworld.svg b/branch-4.6/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.6/_static/img/icons/icon-integrations.svg b/branch-4.6/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-knowledge-base.svg b/branch-4.6/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-less.svg b/branch-4.6/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-live-test.svg b/branch-4.6/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.6/_static/img/icons/icon-mail-list.svg b/branch-4.6/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-manager.svg b/branch-4.6/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.6/_static/img/icons/icon-memory-management.svg b/branch-4.6/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.6/_static/img/icons/icon-modeling.svg b/branch-4.6/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-monitoring.svg b/branch-4.6/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.6/_static/img/icons/icon-networking.svg b/branch-4.6/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.6/_static/img/icons/icon-news.svg b/branch-4.6/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.6/_static/img/icons/icon-newsletter.svg b/branch-4.6/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.6/_static/img/icons/icon-nsql-guides.svg b/branch-4.6/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.6/_static/img/icons/icon-open-source.svg b/branch-4.6/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.6/_static/img/icons/icon-operator.svg b/branch-4.6/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-overview.svg b/branch-4.6/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.6/_static/img/icons/icon-partners.svg b/branch-4.6/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.6/_static/img/icons/icon-plus.svg b/branch-4.6/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-pricing.svg b/branch-4.6/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.6/_static/img/icons/icon-release-notes.svg b/branch-4.6/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.6/_static/img/icons/icon-resource-center.svg b/branch-4.6/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.6/_static/img/icons/icon-roadmap.svg b/branch-4.6/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.6/_static/img/icons/icon-search.svg b/branch-4.6/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.6/_static/img/icons/icon-slack.svg b/branch-4.6/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-stack-overflow.svg b/branch-4.6/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.6/_static/img/icons/icon-summit.svg b/branch-4.6/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-support.svg b/branch-4.6/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.6/_static/img/icons/icon-tech-talks.svg b/branch-4.6/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.6/_static/img/icons/icon-testing.svg b/branch-4.6/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.6/_static/img/icons/icon-thumbs-down.svg b/branch-4.6/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-thumbs-up.svg b/branch-4.6/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-tip.svg b/branch-4.6/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.6/_static/img/icons/icon-training.svg b/branch-4.6/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.6/_static/img/icons/icon-triangle-down.svg b/branch-4.6/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.6/_static/img/icons/icon-university.svg b/branch-4.6/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.6/_static/img/icons/icon-users-blog.svg b/branch-4.6/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.6/_static/img/icons/icon-warning.svg b/branch-4.6/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-webinars.svg b/branch-4.6/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.6/_static/img/icons/icon-whitepapers.svg b/branch-4.6/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.6/_static/img/icons/icon-workshop.svg b/branch-4.6/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/logo-docs.svg b/branch-4.6/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.6/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.6/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.6/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.6/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.6/_static/img/mascots/404.jpg b/branch-4.6/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.6/_static/img/mascots/404.jpg differ diff --git a/branch-4.6/_static/img/mascots/scylla-3monsters.png b/branch-4.6/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.6/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-alternator.svg b/branch-4.6/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.6/_static/img/mascots/scylla-cloud.svg b/branch-4.6/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.6/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.6/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-computer-headset.png b/branch-4.6/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-cup-number-one.png b/branch-4.6/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-docs.svg b/branch-4.6/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.6/_static/img/mascots/scylla-drivers.svg b/branch-4.6/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.6/_static/img/mascots/scylla-enterprise.svg b/branch-4.6/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.6/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.6/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-forklift-migration.png b/branch-4.6/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-gear.png b/branch-4.6/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-hardhat.png b/branch-4.6/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-headband.png b/branch-4.6/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-headset.png b/branch-4.6/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-hearts.png b/branch-4.6/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-looking-down.png b/branch-4.6/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-looking-up.png b/branch-4.6/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.6/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.6/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-manager.svg b/branch-4.6/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.6/_static/img/mascots/scylla-monitor.svg b/branch-4.6/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.6/_static/img/mascots/scylla-movement-fast.png b/branch-4.6/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-movement.png b/branch-4.6/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-onpremise.png b/branch-4.6/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-opensource.svg b/branch-4.6/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.6/_static/img/mascots/scylla-operator.svg b/branch-4.6/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.6/_static/img/mascots/scylla-plugin.png b/branch-4.6/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-release-mascot.png b/branch-4.6/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-repair.png b/branch-4.6/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-server.png b/branch-4.6/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-sleeping.png b/branch-4.6/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-tall-measure.png b/branch-4.6/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-university.png b/branch-4.6/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-weights.png b/branch-4.6/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-window-cleaning.png b/branch-4.6/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-with-computer-2.png b/branch-4.6/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-with-computer.png b/branch-4.6/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-with-linux.png b/branch-4.6/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-writting.png b/branch-4.6/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.6/_static/img/menu.svg b/branch-4.6/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.6/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.6/_static/img/scylla-monitor.png b/branch-4.6/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.6/_static/img/scylla-monitor.png differ diff --git a/branch-4.6/_static/js/main.bundle.js b/branch-4.6/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-4.6/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
                            • Back
                            • ',backButtonPosition:"top",wrapper:"
                              ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                                "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                                ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                                ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                                ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                                ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                                "],col:[2,"","
                                "],tr:[2,"","
                                "],td:[3,"","
                                "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +

                                ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                + + +
                                + + + + + +
                                + + +
                                + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/genindex.html b/branch-4.6/genindex.html new file mode 100644 index 000000000..70d44736f --- /dev/null +++ b/branch-4.6/genindex.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + + + +
                                + + + + + +
                                + + +
                                + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/index.html b/branch-4.6/index.html new file mode 100644 index 000000000..27d8e8f00 --- /dev/null +++ b/branch-4.6/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                ScyllaDB Monitoring Stack

                                +
                                +
                                +

                                ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                +_images/monitor.png +

                                The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                                +
                                  +
                                • prometheus - collects and stores metrics

                                • +
                                • alertmanager - handles alerts

                                • +
                                • grafana - dashboard server

                                • +
                                +

                                Choose a topic to get started:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/docker-compose.html b/branch-4.6/install/docker-compose.html new file mode 100644 index 000000000..b9c61e25b --- /dev/null +++ b/branch-4.6/install/docker-compose.html @@ -0,0 +1,828 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Using Docker Compose

                                +

                                Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                                +

                                Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                                +
                                +

                                Warning

                                +

                                docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                                +
                                +
                                +

                                Prerequisite

                                +

                                Make sure you have docker and docker-compose installed.

                                +
                                +
                                +

                                Setting Prometheus

                                +

                                The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                                +

                                You can use ./prometheus-config.sh to generate the file, for example:

                                +
                                ./prometheus-config.sh --compose
                                +
                                +
                                +

                                For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                                +
                                +
                                +

                                Setting Grafana Provisioning

                                +

                                Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                                +
                                +

                                Grafana Data-Source file

                                +

                                Run the following command to update the datasource:

                                +
                                ./grafana-datasource.sh --compose
                                +
                                +
                                +

                                You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                                +
                                +
                                +

                                Grafana Dashboard Load file

                                +

                                To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                                +
                                ./generate-dashboards.sh -t -v 2020.1
                                +
                                +
                                +

                                This command generates the files under: grafana/provisioning/dashboards/

                                +
                                +
                                +
                                +

                                Docker Compose file

                                +

                                You can use the following example as a base for your docker compose.

                                +

                                Pass the following to a file called docker-compose.yml

                                +
                                services:
                                +  alertmanager:
                                +    container_name: aalert
                                +    image: prom/alertmanager:v0.24.0
                                +    ports:
                                +    - 9093:9093
                                +    volumes:
                                +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                                +  grafana:
                                +    container_name: agraf
                                +    environment:
                                +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                                +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                                +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                                +    # This is where you set Grafana security
                                +    - GF_AUTH_BASIC_ENABLED=false
                                +    - GF_AUTH_ANONYMOUS_ENABLED=true
                                +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                                +    - GF_SECURITY_ADMIN_PASSWORD=admin
                                +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                                +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                                +    image: grafana/grafana:9.3.11
                                +    ports:
                                +    - 3000:3000
                                +    user: 1000:1000
                                +    volumes:
                                +    - ./grafana/build:/var/lib/grafana/dashboards
                                +    - ./grafana/plugins:/var/lib/grafana/plugins
                                +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                                +    # Uncomment the following line for grafana persistency
                                +    # - path/to/grafana/dir:/var/lib/grafana
                                +  loki:
                                +    command:
                                +    - --config.file=/mnt/config/loki-config.yaml
                                +    container_name: loki
                                +    image: grafana/loki:2.7.3
                                +    ports:
                                +    - 3100:3100
                                +    volumes:
                                +    - ./loki/rules:/etc/loki/rules
                                +    - ./loki/conf:/mnt/config
                                +  promotheus:
                                +    command:
                                +    - --config.file=/etc/prometheus/prometheus.yml
                                +    container_name: aprom
                                +    image: prom/prometheus:v2.42.0
                                +    ports:
                                +    - 9090:9090
                                +    volumes:
                                +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                                +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                                +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                                +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                                +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                                +    # Uncomment the following line for prometheus persistency 
                                +    # - path/to/data/dir:/prometheus/data
                                +  promtail:
                                +    command:
                                +    - --config.file=/etc/promtail/config.yml
                                +    container_name: promtail
                                +    image: grafana/promtail:2.7.3
                                +    ports:
                                +    - 1514:1514
                                +    - 9080:9080
                                +    volumes:
                                +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                                +version: '3'
                                +
                                +
                                +
                                +

                                Start and Stop

                                +

                                To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/index.html b/branch-4.6/install/index.html new file mode 100644 index 000000000..92b9f4290 --- /dev/null +++ b/branch-4.6/install/index.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Download and Install Scylla Monitoring Stack

                                +
                                +
                                +

                                Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                                +

                                Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/min-prod-hw.html b/branch-4.6/install/min-prod-hw.html new file mode 100644 index 000000000..7700a392d --- /dev/null +++ b/branch-4.6/install/min-prod-hw.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Minimal Production System Recommendations

                                +
                                  +
                                • CPU - at least 2 physical cores/ 4vCPUs

                                • +
                                • Memory - 15GB+ DRAM and proportional to the number of cores.

                                • +
                                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                • +
                                • Network - 1GbE/10GbE preferred

                                • +
                                +
                                +

                                Calculating Prometheus Minimal Disk Space requirement

                                +

                                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                +

                                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                +

                                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                +
                                6 * 16 * 15 * 12MB ~ 16GB
                                +
                                +
                                +

                                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                +
                                +
                                +

                                Calculating Prometheus Minimal Memory Space requirement

                                +

                                Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                +

                                For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                + +
                                + +++++++ + + + +
                                # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                00
                                + +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/monitor-without-docker.html b/branch-4.6/install/monitor-without-docker.html new file mode 100644 index 000000000..6a360948a --- /dev/null +++ b/branch-4.6/install/monitor-without-docker.html @@ -0,0 +1,1171 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Deploying Scylla Monitoring Stack Without Docker

                                +
                                +

                                Introduction

                                +

                                The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                                +

                                Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                                +

                                Scylla Monitoring uses the following components:

                                +
                                  +
                                • Alertmanager

                                • +
                                • Grafana Loki

                                • +
                                • Prometheus

                                • +
                                • Grafana

                                • +
                                +

                                The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components.

                                +

                                We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                                +
                                +
                                +

                                Minimal Production System Recommendations

                                +
                                  +
                                • CPU - at least 2 physical cores/ 4vCPUs

                                • +
                                • Memory - 15GB+ DRAM and proportional to the number of cores.

                                • +
                                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                • +
                                • Network - 1GbE/10GbE preferred

                                • +
                                +
                                +

                                Calculating Prometheus Minimal Disk Space requirement

                                +

                                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                +

                                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                +

                                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                +
                                6 * 16 * 15 * 12MB ~ 16GB
                                +
                                +
                                +

                                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                +
                                +
                                +

                                Calculating Prometheus Minimal Memory Space requirement

                                +

                                Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                +

                                For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                + +
                                + +++++++ + + + +
                                # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                00
                                + +
                                +

                                The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                                +
                                +

                                Note

                                +

                                Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                                +
                                +
                                +
                                +
                                +

                                Install Scylla Monitoring Stack

                                +

                                The following procedure uses a CentOS 7 based instance

                                +
                                  +
                                1. Download the latest Scylla Monitoring Stack release.

                                2. +
                                +
                                wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.6.2.tar.gz
                                +
                                +
                                +
                                  +
                                1. Open the tar

                                2. +
                                +

                                tar -xvf scylla-monitoring-*.tar.gz

                                +
                                +
                                +

                                Install Alertmanager

                                +

                                Tested with alertmanager 0.22.2 version

                                +
                                  +
                                1. Install alertmanager

                                2. +
                                +
                                wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                                +tar -xvf alertmanager-*.linux-amd64.tar.gz
                                +
                                +
                                +
                                  +
                                1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                                2. +
                                +

                                For example:

                                +
                                cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.6.2/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                                +
                                +
                                +
                                  +
                                1. Start the Alertmanager

                                2. +
                                +

                                For example:

                                +
                                cd alertmanager-0.22.2.linux-amd64
                                +./alertmanager
                                +
                                +
                                +
                                  +
                                1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                                2. +
                                +

                                For example:

                                +
                                http://192.168.135.166:9093/
                                +
                                +
                                +../_images/alertmanager.png +
                                +
                                +

                                Install Grafana Loki

                                +

                                Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                                +

                                We recomand using Loki with containers, but you can install it locally as described in Loki installation

                                +

                                You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                                +

                                Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                                +

                                Loki Related files

                                +

                                Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                                +
                                mkdir -p /etc/loki/rules
                                +mkdir -p /etc/loki/config
                                +cp loki/rules/* /etc/loki/rules
                                +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                                +
                                +
                                +

                                Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                                +

                                Promtail Related files

                                +

                                Promtail has a configuration file. You need to copy and modify the configuration.

                                +
                                mkdir -p /etc/promtail/
                                +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                                +
                                +
                                +

                                Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                                +
                                +
                                +

                                Install Prometheus

                                +

                                Tested with Prometheus version 2.27.1

                                +
                                +

                                Note

                                +

                                If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                                +
                                +
                                  +
                                1. Install Prometheus

                                2. +
                                +
                                wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                                +tar -xvf prometheus-*.linux-amd64.tar.gz
                                +
                                +
                                +

                                2. Create Data and Config directories +.. code-block:: shell

                                +
                                +

                                mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                                +
                                +
                                  +
                                1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                                2. +
                                +

                                Copy prometheus/prometheus.yml.template to prometheus.yml

                                +

                                For example:

                                +
                                cp scylla-monitoring-scylla-monitoring-4.6.2/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                                +cp scylla-monitoring-scylla-monitoring-4.6.2/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                                +
                                +
                                +
                                  +
                                1. Edit the prometheus.yml file to point to the correct static data sources.

                                2. +
                                +
                                +

                                Note

                                +

                                Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                                +
                                +
                                vi /etc/prometheus/prometheus.yml
                                +
                                +
                                +

                                Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                                +

                                For example if the alertmanager will run on the same host:

                                +
                                alerting:
                                +   alertmanagers:
                                +   - static_configs:
                                +       - targets:
                                +           - 127.0.0.1:9093
                                +
                                +
                                +

                                Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                                +

                                For example the scrape config for Scylla:

                                +
                                global:
                                +  scrape_interval: 5s # By default, scrape targets every 5 second.
                                +  scrape_timeout: 4s # Timeout before trying to scape a target again
                                +
                                +  # Attach these labels to any time series or alerts when communicating with
                                +  # external systems (federation, remote storage, Alertmanager).
                                +  external_labels:
                                +    monitor: 'scylla-monitor'
                                +
                                +scrape_configs:
                                +- job_name: scylla
                                +  honor_labels: false
                                +  file_sd_configs:
                                +    - files:
                                +      - /etc/scylla.d/prometheus/scylla_servers.yml
                                +  relabel_configs:
                                +    - source_labels: [__address__]
                                +      regex:  '([^:]+)'
                                +      target_label: __address__
                                +      replacement: '${1}:9180'
                                +
                                +    - source_labels: [__address__]
                                +      regex:  '(.*):.+'
                                +      target_label: instance
                                +      replacement: '${1}'
                                +
                                +
                                +
                                  +
                                1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                                2. +
                                +
                                +

                                Note

                                +

                                There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                                +
                                +

                                An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                                +
                                +

                                Note

                                +

                                You must have both files even if you are not using Scylla Manager

                                +
                                +

                                Add the labels for the cluster and data-center

                                +

                                scylla_servers.yml:

                                +

                                For example:

                                +
                                cat scylla_servers.yml
                                +# List Scylla end points
                                +
                                +- targets:
                                +  - 192.168.66.6
                                +  - 192.168.66.244
                                +  labels:
                                +    cluster: cluster1
                                +    dc: dc1
                                +- targets:
                                +    - 172.17.0.3
                                +  labels:
                                +    cluster: cluster1
                                +    dc: dc2
                                +
                                +
                                +
                                +

                                Note

                                +

                                See the previous note about deprecating the node_exporter_servers.yml file.

                                +
                                +

                                scylla_manager_server.yml

                                +

                                For example:

                                +
                                - targets:
                                +  - 127.0.0.1:5090
                                +
                                +
                                +
                                  +
                                1. Start Prometheus server:

                                2. +
                                +

                                For example:

                                +
                                cd scylla-monitoring-scylla-monitoring-4.6.2/
                                +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                                +
                                +
                                +

                                Data should start accumulate on: /prometheus/data

                                +
                                  +
                                1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                                2. +
                                +

                                For example:

                                +
                                http://192.168.135.166:9090/
                                +
                                +
                                +../_images/1.png +

                                Prometheus console should be visible

                                +
                                  +
                                1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                                2. +
                                +

                                For example:

                                +

                                node_memory_MemFree

                                +../_images/2.png +

                                And

                                +

                                scylla_reactor_utilization

                                +../_images/3.png +

                                At this point Scylla is emitting the metrics and Prometheus is able to store them.

                                +
                                +
                                +

                                Install Grafana

                                +

                                Tested with Grafna 7.5.7

                                +
                                  +
                                1. Install Grafana based on the instructions here

                                2. +
                                +

                                Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                                +
                                  +
                                1. Access Scylla-Grafana-monitoring directory

                                2. +
                                +
                                cd scylla-monitoring-scylla-monitoring-4.6.2/
                                +
                                +
                                +
                                  +
                                1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                                2. +
                                +
                                sudo cp -r grafana/plugins /var/lib/grafana/
                                +
                                +
                                +

                                If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                                +

                                For example:

                                +
                                cp -r grafana/plugins ../grafana-7.5.7/public/app
                                +
                                +
                                +
                                  +
                                1. Provision the Dashboards

                                2. +
                                +

                                For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                                +

                                For Grafana installed with yum install

                                +
                                sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                                +sudo mkdir -p /var/lib/grafana/dashboards
                                +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                                +
                                +
                                +

                                For Grafana installed from packages

                                +
                                cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                                +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                                +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                                +
                                +
                                +

                                Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                                +
                                +

                                Note

                                +

                                A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                                +
                                +
                                  +
                                1. Set the data source by copy datasource.yml and edit it

                                2. +
                                +
                                sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                                +
                                +
                                +
                                +

                                Note

                                +

                                Scylla uses a plugin to read from some system tables see the section below about using it.

                                +
                                +

                                For Grafana installed from packages

                                +
                                cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                                +
                                +
                                +

                                You should set the Prometheus and the alertmanager IP and port.

                                +

                                For example

                                +
                                sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                                +apiVersion: 1
                                +datasources:
                                + - name: prometheus
                                +   type: prometheus
                                +   url: http://192.168.135.167:9090
                                +   access: proxy
                                +   basicAuth: false
                                +
                                + - name: alertmanager
                                +   type: camptocamp-prometheus-alertmanager-datasource
                                +   orgId: 1
                                +   typeLogoUrl: public/img/icn-datasource.svg
                                +   access: proxy
                                +   url: http://192.168.135.166:9093
                                +   password:
                                +   user:
                                +   database:
                                +   basicAuth:
                                +   isDefault:
                                +   jsonData:
                                +     severity_critical: '4'
                                +     severity_high: '3'
                                +     severity_warning: '2'
                                +     severity_info: '1'
                                +
                                +
                                +
                                  +
                                1. Start the Grafana service

                                2. +
                                +

                                For Grafana installed with yum install

                                +

                                sudo service grafana-server start

                                +

                                For Grafana installed from packages:

                                +

                                cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                                +

                                Edit scylla.ini to reflect the right paths in the paths section of the file.

                                +
                                plugins = /home/centos/grafana-7.5.7/data/plugins
                                +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                                +
                                +
                                +

                                Start the server:

                                +
                                cd /home/centos/grafana-7.5.7/
                                +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                                +
                                +
                                +
                                  +
                                1. Make sure Grafana is running

                                2. +
                                +

                                Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                                +../_images/grafana.png +
                                +
                                +

                                Using Scylla Plugin with Grafana

                                +

                                Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                                +

                                Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                                +
                                +

                                Setting a monitoring user

                                +

                                This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                                +
                                  +
                                • If you have not done so, enable authorization first.

                                • +
                                • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                                • +
                                • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                                • +
                                +
                                +
                                +

                                Installing the Plugin

                                +

                                Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                                +
                                +
                                +

                                Configure the Plugin

                                +

                                Add an entry to the datasource.yml file

                                +
                                - name: scylla-datasource
                                +  type: scylladb-scylla-datasource
                                +  orgId: 1
                                +  isDefault:
                                +  jsonData:
                                +  host: ''
                                +#  secureJsonData:
                                +#    user: 'scylla_monitoring'
                                +#    password: 'scylla_monitoring'
                                +
                                +
                                +

                                As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                                +
                                +
                                +

                                Enable the Plugin

                                +

                                Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                                +

                                See more about it the Grafana configuration.

                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/monitoring-stack.html b/branch-4.6/install/monitoring-stack.html new file mode 100644 index 000000000..8e4bf1987 --- /dev/null +++ b/branch-4.6/install/monitoring-stack.html @@ -0,0 +1,1118 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Install Scylla Monitoring Stack

                                +

                                This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                                +

                                The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                                +

                                For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                                +
                                +

                                Minimal Production System Recommendations

                                +
                                  +
                                • CPU - at least 2 physical cores/ 4vCPUs

                                • +
                                • Memory - 15GB+ DRAM and proportional to the number of cores.

                                • +
                                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                • +
                                • Network - 1GbE/10GbE preferred

                                • +
                                +
                                +

                                Calculating Prometheus Minimal Disk Space requirement

                                +

                                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                +

                                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                +

                                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                +
                                6 * 16 * 15 * 12MB ~ 16GB
                                +
                                +
                                +

                                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                +
                                +
                                +

                                Calculating Prometheus Minimal Memory Space requirement

                                +

                                Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                +

                                For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                + +
                                + +++++++ + + + +
                                # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                00
                                + +
                                +
                                +
                                +
                                +

                                Prerequisites

                                +
                                  +
                                • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                                • +
                                • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                                • +
                                + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                Scylla Monitoring Stack Compatibility Matrix

                                Scylla Monitoring Stack Version

                                Prometheus Version

                                Grafana Version

                                4.6

                                2.48.1

                                10.2.2

                                4.5

                                2.47.1

                                10.1.5

                                4.4

                                2.44.0

                                9.5.2

                                4.3

                                2.42.0

                                9.3.8

                                4.2

                                2.41.0

                                9.3.4

                                4.1

                                2.38.0

                                9.1.0

                                4.0

                                2.34.0

                                8.5.2

                                3.11

                                2.32.0

                                8.3.4

                                3.10

                                2.32.0

                                8.3.3

                                3.9.2

                                2.29.1

                                8.2.7

                                3.9

                                2.29.1

                                8.1.1

                                3.8

                                2.27.1

                                7.5.7

                                3.7

                                2.25.2

                                7.4.0

                                3.6

                                2.18.1

                                7.3.5

                                3.5

                                2.18.1

                                7.1.5

                                3.4

                                2.18.1

                                6.7.3

                                +
                                +
                                +

                                Docker Post Installation

                                +

                                Docker post installation guide can be found here

                                +
                                +

                                Note

                                +

                                Avoid running the container as root.

                                +
                                +

                                To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                                +
                                  +
                                1. Create the Docker group.

                                2. +
                                +
                                sudo groupadd docker
                                +
                                +
                                +
                                  +
                                1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                                2. +
                                +
                                sudo usermod -aG docker $USER
                                +
                                +
                                +
                                  +
                                1. Start Docker by calling:

                                2. +
                                +
                                sudo systemctl enable docker
                                +
                                +
                                +
                                +
                                +

                                Install Scylla Monitoring Stack

                                +

                                Procedure

                                +
                                  +
                                1. Download and extract the latest Scylla Monitoring Stack binary;.

                                2. +
                                +
                                wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.6.2.tar.gz
                                +tar -xvf scylla-monitoring-4.6.2.tar.gz
                                +cd scylla-monitoring-scylla-monitoring-4.6.2
                                +
                                +
                                +

                                As an alternative, you can clone and use the Git repository directly.

                                +
                                git clone https://github.com/scylladb/scylla-monitoring.git
                                +cd scylla-monitoring
                                +git checkout branch-4.6
                                +
                                +
                                +
                                  +
                                1. Start Docker service if needed

                                2. +
                                +
                                sudo systemctl restart docker
                                +
                                +
                                +
                                +
                                +

                                Configure Scylla Monitoring Stack

                                +

                                To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                                +

                                This configuration can be done from files, or using the Consul api.

                                +

                                Scylla Manager 2.0 and higher supports the Consul API.

                                +
                                +

                                Configure Scylla nodes from files

                                +
                                  +
                                1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                                2. +
                                +
                                +

                                Note

                                +

                                It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                                +
                                +

                                For example:

                                +
                                - targets:
                                +      - 172.17.0.2
                                +      - 172.17.0.3
                                +  labels:
                                +      cluster: cluster1
                                +      dc: dc1
                                +
                                +
                                +
                                +

                                Note

                                +

                                If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                                +
                                +

                                Using IPV6

                                +

                                To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets.

                                +

                                For example:

                                +
                                - targets:
                                +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]"
                                +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]"
                                +  labels:
                                +      cluster: cluster1
                                +      dc: dc1
                                +
                                +
                                +
                                +

                                Note

                                +

                                For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                                +
                                +

                                For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                                +
                                +

                                Note

                                +

                                By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                                +
                                +

                                If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                                +

                                For example:

                                +
                                ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                                +
                                +
                                +

                                Mark the different Data Centers with Labels.

                                +

                                As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                                +

                                You can use the genconfig.py script to generate the server file. For example:

                                +
                                ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                                +
                                +
                                +

                                This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                                +

                                OR

                                +

                                The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                                +
                                nodetool status | ./genconfig.py -NS
                                +
                                +
                                +

                                2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                                +

                                You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                                +

                                For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                                +
                                # List Scylla Manager end points
                                +
                                +- targets:
                                +  - 172.17.0.7:5090
                                +
                                +
                                +

                                Note that you do not need to add labels to the Scylla Manager targets.

                                +
                                +
                                +

                                Configure Scylla nodes using Scylla-Manager Consul API

                                +

                                Scylla Manager 2.0 has a Consul like API.

                                +

                                When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                                +

                                For example:

                                +
                                ./start-all.sh -L 10.10.0.1
                                +
                                +
                                +
                                +

                                Note

                                +

                                If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                                +
                                +
                                +
                                +

                                Connecting Scylla-Monitoring to ScyllaDB

                                +

                                Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                                +

                                You can limit the user to read only, currently it only read table from the system keyspace.

                                +

                                You can set a user and password from a file or environment variables.

                                +

                                If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                                +

                                To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                                +
                                +

                                Note

                                +

                                It is best to use a dedicated user and password with limited privileges.

                                +
                                +
                                +
                                +

                                Use an external directory for the Prometheus data directory

                                +

                                The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                                +
                                +

                                Note

                                +

                                Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                                +
                                +

                                If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                                +

                                In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                                +
                                +
                                +

                                Add Additional Prometheus Targets

                                +

                                There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                                +

                                The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                                +

                                You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                                +
                                - job_name: 'myservice'
                                +  # Override the global default and scrape targets from this job every 5 seconds.
                                +  scrape_interval: 5s
                                +  static_configs:
                                +    - targets:
                                +      - 17.0.0.1:7000
                                +
                                +
                                +
                                +
                                +
                                +

                                Start and Stop Scylla Monitoring Stack

                                +
                                +

                                Start

                                +
                                ./start-all.sh -d prometheus_data
                                +
                                +
                                +
                                +
                                +

                                Stop

                                +
                                ./kill-all.sh
                                +
                                +
                                +
                                +
                                +

                                Start a Specific Scylla Monitoring Stack Version

                                +

                                By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                                +

                                You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                                +

                                Multiple versions are supported. For example:

                                +
                                ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                                +
                                +
                                +

                                will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                                +
                                +
                                +

                                Accessing the localhost

                                +

                                The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                                +
                                ./start-all.sh -l -d prometheus-data
                                +
                                +
                                +
                                +
                                +

                                Configure rsyslog on each Scylla node

                                +

                                generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                                +

                                Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                                +

                                Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                                +

                                If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                                +
                                if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                                +
                                +
                                +

                                Restart rsyslog for the configuration to take effect.

                                +
                                systemctl restart rsyslog
                                +
                                +
                                +
                                +
                                +
                                +

                                View Grafana Dashboards

                                +

                                Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/start-all.html b/branch-4.6/install/start-all.html new file mode 100644 index 000000000..a21bc74c4 --- /dev/null +++ b/branch-4.6/install/start-all.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                The start-all.sh Command

                                +

                                Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                                +

                                The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                                +
                                +

                                General Options

                                +

                                -h Help, Print the help, and exit.

                                +

                                –version print the current Scylla-Monitoring stack version, and exit.

                                +

                                -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                                +

                                -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                                +

                                -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                                +

                                –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                                +

                                –compose This is an experimental option. When set, it initiates a two-stage process. Firstly, a docker-compose.yml file is created along with an .env file. Following this, the script executes docker-compose up. Please note that having docker-compose is a prerequisite.

                                +
                                + + +
                                +

                                Alert Manager

                                +

                                The Alertmanager handles the alerts and takes the following parameters:

                                +

                                -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                                +

                                -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                                +

                                -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/thanos.html b/branch-4.6/install/thanos.html new file mode 100644 index 000000000..d1e13bcfd --- /dev/null +++ b/branch-4.6/install/thanos.html @@ -0,0 +1,769 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Using Thanos as Data Source With Scylla Monitoring Stack

                                +

                                Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                                +
                                  +
                                • High-availability.

                                • +
                                • Horizontal scaling.

                                • +
                                • Backup.

                                • +
                                +

                                The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                                +

                                The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                                +
                                +

                                Using Thanos As a Prometheus Aggregator

                                +

                                There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                                +
                                +

                                Prometheus Configuration

                                +

                                We will assume you have two Prometheus servers running.

                                +
                                  +
                                1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                                2. +
                                3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                                4. +
                                +
                                +
                                +

                                Thanos sidecar

                                +

                                The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                                +
                                docker run -d \
                                + -v /path/to/prom/dir:/data/prom:z \
                                + -i --name sidecar thanosio/thanos \
                                + sidecar \
                                + --grpc-address=0.0.0.0:10911 \
                                + --grpc-grace-period=1s \
                                + --http-address=0.0.0.0:10912 \
                                + --http-grace-period=1s \
                                + --prometheus.url=http://prometheus-ip:9090 \
                                + --tsdb.path=/data/prom \
                                + -p 10912:10912 \
                                + -p 10911:10911
                                +
                                +
                                +

                                After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                                +
                                +
                                +

                                Thanos query

                                +

                                Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                                +
                                docker run -d \
                                + --name thanos -- thanosio/thanos \
                                +   query \
                                +   --debug.name=query0 \
                                +   --log.level=debug \
                                +   --grpc-address=0.0.0.0:10903 \
                                +   --grpc-grace-period=1s \
                                +   --http-address=0.0.0.0:10904 \
                                +   --http-grace-period=1s \
                                +   --query.replica-label=prometheus \
                                +   --store={ip1}:10911 --store={ip2}:10911
                                +
                                +
                                +

                                After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                                +
                                +
                                +

                                Update Scylla Data source

                                +

                                The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                                +

                                The file you edit is a template file that replaces the file Grafana uses, next time you start.

                                +

                                Restart the Scylla Monitoring Stack it should now use Thanos.

                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/intro.html b/branch-4.6/intro.html new file mode 100644 index 000000000..f82a10669 --- /dev/null +++ b/branch-4.6/intro.html @@ -0,0 +1,718 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                ScyllaDB Monitoring Stack

                                +

                                ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                +_images/monitor.png +

                                The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                                +
                                  +
                                • prometheus - Collects and stores metrics

                                • +
                                • grafan-loki - Parses logs and generates metrics and alerts

                                • +
                                • alertmanager - Handles alerts

                                • +
                                • grafana - Dashboards server

                                • +
                                +

                                A few optional components are used for additional services

                                +
                                  +
                                • grafana-image-renderer - Allows you to download a dashboard as an image.

                                • +
                                • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                                • +
                                +
                                +

                                High Level Architecture

                                +_images/monitoring_stack1.png +

                                We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                                +

                                We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                                +

                                The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                                +

                                We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                                +

                                Choose a topic to get started:

                                + +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/objects.inv b/branch-4.6/objects.inv new file mode 100644 index 000000000..7f8272894 Binary files /dev/null and b/branch-4.6/objects.inv differ diff --git a/branch-4.6/procedures/alerts/alerting.html b/branch-4.6/procedures/alerts/alerting.html new file mode 100644 index 000000000..3dc353b19 --- /dev/null +++ b/branch-4.6/procedures/alerts/alerting.html @@ -0,0 +1,787 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Alerting

                                +

                                Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                                +

                                You can read more about Prometheus alerting here

                                +

                                By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                                +

                                In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                                +

                                The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                                +../../_images/monitoring_stack.png +
                                +

                                Prometheus Alerts

                                +

                                The Prometheus alerts are defined in files placed under prometheus/prom_rules/. Prometheus will load any file that ends with yml or yaml.

                                +

                                Each Prometheus alert consists of:

                                +
                                  +
                                • Name

                                • +
                                • What happened

                                • +
                                • For how long

                                • +
                                • What to report

                                • +
                                +

                                For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                                +
                                - alert: InstanceDown
                                +  expr: up == 0
                                +  for: 60s
                                +  labels:
                                +    severity: "error"
                                +  annotations:
                                +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                                +    summary: Instance {{ $labels.instance }} down
                                +
                                +
                                +

                                The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                                +

                                The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                                +

                                The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to error.

                                +

                                annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                                +
                                +

                                Alerts severity

                                +

                                Prometheus uses the following severities from low to high: info, warn, error, critical.

                                +

                                The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the error alert for disk-full is firing, it silences the warn alert.

                                +

                                When adding your own alerts, you can use the severities to signal the action’s importance, for example critical would be a pager-duty, while an error will be an email.

                                +
                                +
                                +

                                Adding Alerts

                                +

                                Add your own alerts in a separate file with a yml or yaml extension. Making it easier during upgrade.

                                +
                                +
                                +

                                Modifying Alerts

                                +

                                It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade.

                                +
                                +
                                +
                                +

                                Alertmanager

                                +

                                The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                                +

                                The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                                +
                                  +
                                • Routes: Represent a routing tree, the most specific rule, wins

                                • +
                                • Inhibition: Mute an alert, based on another alert

                                • +
                                • Receiver: Send a notification via email, sluck, etc’

                                • +
                                +

                                Check the Alertmanager documentation for details on how to specify a specific receiver.

                                +

                                In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                                +
                                +
                                +

                                Tips When Adding an Alert

                                +

                                It’s worse having an alert that does not work, than not having an alert at all

                                +

                                There are multiple ways you can use to make sure your alert is set correctly:

                                +
                                  +
                                • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                                • +
                                • Force the alert to be active by reducing the limits or the duration.

                                • +
                                • When possible simulate the actual scenario and see that the alert works as expected.

                                • +
                                +

                                For example, low available disk space.

                                +

                                Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                                +

                                Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                                +

                                Starting with a simple working expression helps you bisect problems.

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/procedures/alerts/index.html b/branch-4.6/procedures/alerts/index.html new file mode 100644 index 000000000..0fde101c9 --- /dev/null +++ b/branch-4.6/procedures/alerts/index.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Stack Alert Manager

                                +
                                +
                                +

                                Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/procedures/datadog/index.html b/branch-4.6/procedures/datadog/index.html new file mode 100644 index 000000000..52694ffad --- /dev/null +++ b/branch-4.6/procedures/datadog/index.html @@ -0,0 +1,762 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Datadog Integration

                                +

                                The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                                +
                                  +
                                1. Installing and configuring the Datadog Agent.

                                2. +
                                3. Add Datadog recording rules.

                                4. +
                                5. Loading Scylla dashboard to Datadog.

                                6. +
                                7. Optionally load Monitor (Alerts).

                                8. +
                                +
                                +

                                Note

                                +

                                Scylla Cloud users, use and update the proper configuration file.

                                +
                                +
                                +

                                Install And configure the Datadog Agent

                                +

                                Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                                +

                                Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                +
                                +

                                Scylla Cloud Users

                                +

                                Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                +

                                Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                                +
                                +
                                +

                                Other Scylla Users

                                +

                                Other Scylla users, download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                                +
                                +
                                +

                                Post configuration

                                +

                                Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                                +
                                +

                                Note

                                +

                                By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                                +
                                +
                                +
                                +
                                +

                                Add datadog recording rules

                                +

                                Non Scylla Cloud users, download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                                +

                                Cloud users, skip this step, it’s been take care for by the cloud.

                                +
                                +
                                +

                                Upload the Dashboard

                                +

                                Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                                +
                                +
                                +

                                Using the Dashboard

                                +

                                We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                                +../../_images/datadog.png +

                                The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                                +
                                +

                                Note

                                +

                                Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                                +
                                +
                                +
                                +

                                Adding Monitor

                                +

                                Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/procedures/index.html b/branch-4.6/procedures/index.html new file mode 100644 index 000000000..ba6e071f0 --- /dev/null +++ b/branch-4.6/procedures/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                ScyllaDB Monitoring Stack Procedures

                                +
                                +
                                +

                                There are several reference guides available which give additional information. Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/procedures/updating-dashboard.html b/branch-4.6/procedures/updating-dashboard.html new file mode 100644 index 000000000..756259fc9 --- /dev/null +++ b/branch-4.6/procedures/updating-dashboard.html @@ -0,0 +1,974 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Adding and Modifying Dashboards

                                +

                                This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                                +

                                It covers dashboard templates and how to modify them.

                                + +
                                +

                                General Limitations

                                +

                                Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                                +
                                +

                                Consistency Between Restarts

                                +

                                By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                                +
                                +
                                +

                                Consistency Between Upgrades

                                +

                                As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                                +
                                +

                                Note

                                +

                                 You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                                +
                                +

                                At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                                +
                                +
                                +
                                +

                                Using Templated Dashboards

                                +

                                Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                                +

                                Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                                +

                                For example a typical graph panel would look like this:

                                +
                                {
                                +    "aliasColors": {},
                                +    "bars": false,
                                +    "datasource": "prometheus",
                                +    "editable": true,
                                +    "error": false,
                                +    "fill": 0,
                                +    "grid": {
                                +        "threshold1": null,
                                +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                                +        "threshold2": null,
                                +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                                +    },
                                +    "gridPos": {
                                +        "h": 6,
                                +        "w": 10,
                                +        "x": 0,
                                +        "y": 4
                                +    },
                                +    "id": 2,
                                +    "isNew": true,
                                +    "legend": {
                                +        "avg": false,
                                +        "current": false,
                                +        "max": false,
                                +        "min": false,
                                +        "show": false,
                                +        "total": false,
                                +        "values": false
                                +    },
                                +    "lines": true,
                                +    "linewidth": 2,
                                +    "links": [],
                                +    "nullPointMode": "connected",
                                +    "percentage": false,
                                +    "pointradius": 5,
                                +    "points": false,
                                +    "renderer": "flot",
                                +    "seriesOverrides": [
                                +        {}
                                +    ],
                                +    "span": 5,
                                +    "stack": false,
                                +    "steppedLine": false,
                                +    "targets": [
                                +        {
                                +            "expr": "sum(node_filesystem_avail) by (instance)",
                                +            "intervalFactor": 1,
                                +            "legendFormat": "",
                                +            "refId": "A",
                                +            "step": 1
                                +        }
                                +    ],
                                +    "timeFrom": null,
                                +    "timeShift": null,
                                +    "title": "Available Disk Size",
                                +    "tooltip": {
                                +        "msResolution": false,
                                +        "shared": true,
                                +        "sort": 0,
                                +        "value_type": "cumulative"
                                +    },
                                +    "transparent": false,
                                +    "type": "graph",
                                +    "xaxis": {
                                +        "show": true
                                +    },
                                +    "yaxes": [
                                +        {
                                +            "format": "percent",
                                +            "logBase": 1,
                                +            "max": 101,
                                +            "min": 0,
                                +            "show": true
                                +        },
                                +        {
                                +            "format": "short",
                                +            "logBase": 1,
                                +            "max": null,
                                +            "min": null,
                                +            "show": true
                                +        }
                                +    ]
                                +}
                                +
                                +
                                +

                                As you can imagine, most panels would have similar values.

                                +

                                To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                                +
                                +

                                The Template Class System

                                +

                                The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                                +

                                The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                                +

                                In the template file, you can also add or override attributes.

                                +

                                The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                                +

                                When generating dashboards, each class will be replaced by its definition.

                                +

                                For example, a row in the type.json is defined as:

                                +
                                {
                                + "base_row": {
                                +     "collapse": false,
                                +     "editable": true
                                + },
                                + "row": {
                                +     "class": "base_row",
                                +     "height": "250px"
                                + }
                                + }
                                +
                                +
                                +

                                Will be used like in a template:

                                +
                                {
                                +     "class": "row",
                                +     "height": "150px",
                                +     "panels": [
                                +     ]
                                +}
                                +
                                +
                                +

                                And the output will be:

                                +
                                {
                                +     "class": "row",
                                +     "collapse": false,
                                +     "editable": true,
                                +     "height": "150px",
                                +     "panels": [
                                +
                                +     ]
                                +}
                                +
                                +
                                +

                                We can see that the template added the panels attribute and that it overrides the height attribute.

                                +
                                +
                                +

                                Panel Example

                                +

                                Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                                +
                                {
                                +     "class": "row",
                                +     "panels": [
                                +         {
                                +             "class": "bytes_panel",
                                +             "span": 3,
                                +             "targets": [
                                +                 {
                                +                     "expr": "sum(node_filesystem_avail) by (instance)",
                                +                     "intervalFactor": 1,
                                +                     "legendFormat": "",
                                +                     "metric": "",
                                +                     "refId": "A",
                                +                     "step": 1
                                +                 }
                                +             ],
                                +             "title": "Available Disk Size"
                                +         }
                                +     ]
                                +}
                                +
                                +
                                +

                                In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                                +

                                You can also see that the span attribute is overridden to set the panel size.

                                +

                                To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                                +
                                +
                                +

                                Grafana Formats and Layouts

                                +

                                The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                                +

                                Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                                +

                                The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                                +

                                To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                                +

                                The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                                +

                                You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                                +

                                gridPos has the following attributes:

                                +
                                {
                                +   "x": 0,
                                +   "y": 0,
                                +   "w": 24,
                                +   "h": 4
                                + }
                                +
                                +
                                +

                                When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                                +
                                {
                                +   "gridPos": {
                                +      "h": 2
                                +    }
                                +}
                                +
                                +
                                +
                                +
                                +

                                Generating the dashboards from templates (generate-dashboards.sh)

                                +
                                +

                                Prerequisite

                                +

                                Python 2.7

                                +

                                make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                                +

                                Use the -h flag to get help information.

                                +

                                You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                                +

                                When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                                +

                                For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                                +

                                .\generate-dashboards.sh -v 2020.1

                                +
                                +

                                Note

                                +

                                generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                                +
                                +
                                +
                                +
                                +

                                Validation

                                +

                                After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                                +

                                Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/reference/index.html b/branch-4.6/reference/index.html new file mode 100644 index 000000000..5f0ab5927 --- /dev/null +++ b/branch-4.6/reference/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Stack Reference Guide

                                +
                                +
                                +

                                There are several reference guides available which give additional information. Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/reference/matrix.html b/branch-4.6/reference/matrix.html new file mode 100644 index 000000000..3d087ae08 --- /dev/null +++ b/branch-4.6/reference/matrix.html @@ -0,0 +1,870 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Stack Support Matrix

                                +

                                The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                                + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                                Scylla Monitoring Stack Version

                                Scylla Open Source Version

                                Scylla Enterprise Version

                                Node_exporter[1] Version

                                Scylla Manager Version

                                4.6

                                5.2, 5.4

                                2021.1, 2022.1, 2022.2, 2023.1, 2024.1

                                1.4.1

                                3.0, 3.1, 3.2

                                4.5

                                5.0,5.1,5.2,5.4

                                2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                1.4.1

                                3.0, 3.1, 3.2

                                4.4.5

                                5.0,5.1,5.2,5.4

                                2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                1.4.1

                                3.0, 3.1, 3.2

                                4.4

                                5.0,5.1,5.2

                                2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                1.4.1

                                3.0, 3.1

                                4.3

                                5.0,5.1,5.2

                                2020.1, 2021.1, 2022.1, 2022.2

                                1.4.1

                                2.5, 2.6, 3.0

                                4.2

                                4.5,4.6,5.0,5.1

                                2020.1, 2021.1, 2022.1, 2022.2

                                1.4.1

                                2.5, 2.6, 3.0

                                4.1

                                4.5,4.6,5.0,5.1

                                2020.1, 2021.1, 2022.1, 2022.2

                                0.17

                                2.5, 2.6, 3.0

                                4.0

                                4.3, 4.4, 4.5, 4.6, 5.0

                                2020.1, 2021.1, 2022.1

                                0.17

                                2.3, 2.4, 2.5, 2.6, 3.0

                                3.11

                                4.3, 4.4, 4.5, 4.6, 5.0

                                2020.1, 2021.1, 2022.2

                                0.17

                                2.3, 2.4, 2.5, 2.6

                                3.10

                                4.3, 4.4, 4.5, 4.6

                                2020.1, 2021.1

                                0.17

                                2.3, 2.4, 2.5, 2.6

                                3.9

                                4.3, 4.4, 4.5, 4.6

                                2020.1, 2021.1

                                0.17

                                2.3, 2.4, 2.5

                                3.8

                                4.3, 4.4, 4.5

                                2020.1, 2021.1

                                0.17

                                2.3, 2.4, 2.5

                                3.7

                                4.2, 4.3, 4.4

                                2019.1, 2020.1, 2021.1

                                0.17

                                2.2, 2.3

                                3.6.3

                                4.2, 4.3, 4.4

                                2019.1, 2020.1, 2021.1

                                0.17

                                2.2, 2.3, 2.1

                                3.6

                                4.1, 4.2, 4.3

                                2019.1, 2020.1

                                0.17

                                2.1, 2.2, 2.3

                                3.6.1

                                4.1, 4.2, 4.3

                                2019.1, 2020.1

                                0.17

                                2.1, 2.2

                                3.6.1

                                4.1, 4.2, 4.3, 4.4

                                2019.1, 2020.1

                                0.17

                                2.1, 2.2

                                3.5

                                3.3, 4.0, 4.1, 4.2

                                2019.1, 2020.1

                                0.17

                                2.0, 2.1, 2.2

                                3.4.3

                                3.3, 4.0, 4.1, 4.2

                                2019.1, 2020.1

                                0.17

                                2.0, 2.1

                                3.4

                                3.3, 4.0, 4.1

                                2018.1, 2019.1

                                0.17

                                2.0, 2.1

                                3.3

                                3.1, 3.2, 3.3, 4.0

                                2018.1, 2019.1

                                0.17

                                1.4, 2.0, 2.1

                                3.2

                                3.1, 3.2, 3.3

                                2018.1, 2019.1

                                0.17

                                1.4, 2.0

                                3.1

                                2.3, 3.0, 3.1, 3.2

                                2018.1, 2019.1

                                0.17

                                1.3, 1.4, 2.0

                                3.0

                                2.3, 3.0, 3.1, 3.2

                                2018.1, 2019.1

                                0.17

                                1.3, 1.4

                                2.4

                                2.3, 3.0, 3.1

                                2018.1, 2019.1

                                0.14, 0.17

                                1.3, 1.4

                                2.3

                                2.3, 3.0

                                2018.1, 2019.1

                                0.14, 0.17

                                1.3

                                2.2

                                2.3, 3.0

                                2018.1, 2019.1

                                0.14, 0.17

                                1.3

                                2.1

                                2.3, 3.0

                                2018.1

                                0.14, 0.17

                                1.3

                                +

                                [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/reference/monitoring-apis.html b/branch-4.6/reference/monitoring-apis.html new file mode 100644 index 000000000..1203c82b0 --- /dev/null +++ b/branch-4.6/reference/monitoring-apis.html @@ -0,0 +1,701 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Stack Interfaces

                                +

                                Scylla exposes two interfaces for online monitoring, as described below

                                +
                                +

                                Prometheus API

                                +

                                By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                                +

                                For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                                +

                                You can change the Prometheus listening address and port in scylla.yaml file

                                +
                                # prometheus port
                                +# By default, Scylla opens prometheus API port on port 9180
                                +# setting the port to 0 will disable the prometheus API.
                                +prometheus_port: 9180
                                +#
                                +# prometheus address
                                +# By default, Scylla binds all interfaces to the prometheus API
                                +# It is possible to restrict the listening address to a specific one
                                +prometheus_address: 0.0.0.0
                                +
                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/robots.txt b/branch-4.6/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.6/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.6/search.html b/branch-4.6/search.html new file mode 100644 index 000000000..54162a1d5 --- /dev/null +++ b/branch-4.6/search.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + + + +
                                + + + + + +
                                + + +
                                + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/searchindex.js b/branch-4.6/searchindex.js new file mode 100644 index 000000000..e8cda71ac --- /dev/null +++ b/branch-4.6/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "6": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 4, 5, 18, 19, 21, 22, 23, 24, 25, 30, 31, 33, 35, 37, 38, 41], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 27, 28, 29, 30, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 27], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 30, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 26, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25, 26], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 26, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 19, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 26, 28, 29, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 26, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25, 26], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 27, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 28, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 26, 33], "user": [1, 2, 6, 7, 9, 27, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25, 26], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9], "refer": [1, 6, 9, 13], "upgrad": [1, 10, 13], "lesson": [1, 9, 28, 29, 30], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25, 26], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 27, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 30, 32, 33, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 27, 31, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25, 26], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 28, 31, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 27, 30, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 12, 14, 19, 21, 22, 23, 24, 25, 26], "onc": [2, 12, 21, 25, 32, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 26, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 26, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 28, 31, 32, 38, 41], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 26, 28, 30, 31, 33, 35, 41], "both": [2, 5, 6, 12, 19, 22, 24, 25, 26, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 27, 39, 41], "updat": [2, 5, 10, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 26, 29, 33, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25, 26], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25, 26], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 26, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18, 26], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 26, 28, 33, 34, 41], "advis": [2, 34, 41], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 26, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26], "databas": [2, 5, 7, 21, 30, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 33, 41], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 26, 27, 31, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 27, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25, 26], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 10, 12, 14, 16, 19, 21, 22, 24, 25, 26, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 26, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 10, 12, 25], "yaml": [2, 5, 10, 12, 17], "To": [2, 4, 5, 6, 12, 14, 17, 21, 22, 23, 24, 25, 26], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25, 26], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 26, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "1": [2, 5, 6, 7, 8, 12, 14, 16, 20, 22, 24, 25, 26], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 28, 31, 33, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 26, 28, 29, 30, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "24": [2, 14, 25], "0": [2, 5, 6, 7, 8, 10, 14, 16, 17, 21, 22, 23, 24, 25, 26], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25, 26], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 14, 19, 22, 24, 25, 26], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 25, 34], "json": [2, 12, 14], "9": [2, 6, 16, 25], "3": [2, 4, 5, 6, 14, 16, 20, 35], "11": [2, 6, 16], "3000": [2, 5, 6, 22, 24, 25, 26], "1000": [2, 33], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 14, 29, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25, 26], "dir": [2, 7, 8, 22, 24, 25, 26], "loki": [2, 6, 9], "mnt": 2, "7": [2, 5, 6, 14, 16], "3100": [2, 5], "rule": [2, 5, 7, 10, 19, 25, 32, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "42": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25, 26], "prom_rul": [2, 5, 10, 12, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25, 26], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 7, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 26, 28, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 19, 21, 25, 26], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 26, 30, 34, 35, 37, 39, 41], "compos": [3, 7], "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 19, 21, 33, 39], "section": [4, 5, 6, 10, 12, 19, 21, 24, 25, 26, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 19, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 30, 34, 35, 37, 41], "default": [4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 25, 26, 31, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 19, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25, 26], "scrape": [4, 5, 6], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 38], "node": [4, 5, 7, 12, 16, 19, 21, 28, 29, 30, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 19, 25, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 26, 28, 30, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 25, 30, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 32, 39, 41], "need": [4, 5, 6, 7, 8, 10, 12, 14, 19, 25, 28, 29, 30, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25, 26], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 26, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 28, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 28, 34, 41], "out": [4, 5, 6, 8, 10, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 7, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25, 26], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 27, 30, 41], "take": [4, 5, 6, 7, 12, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 26, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25, 26], "help": [5, 7, 10, 14, 41], "pleas": [5, 7, 19], "most": [5, 10, 14, 25, 36, 41], "common": [5, 7, 10, 41], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 10, 19], "standalon": [5, 19], "thei": [5, 6, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25, 26], "consolid": 5, "suggest": [5, 14, 25], "those": [5, 25, 26], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 28, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 30, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 26, 28, 29, 35, 41], "support": [5, 6, 14, 15, 27, 41], "want": [5, 6, 10, 22, 24, 25, 26], "latest": [5, 6, 7, 22, 24, 25, 26], "releas": [5, 21, 22, 23, 24, 25, 26], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25, 26], "http": [5, 6, 8, 19, 21, 22, 24, 25, 26, 30, 31, 38], "com": [5, 6, 22, 24, 25, 26, 30, 31, 38], "archiv": [5, 6, 22, 24, 25, 26], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25, 26], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 19, 21, 22, 23, 24, 26], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25, 26], "p": [5, 7, 8, 19, 21, 22, 24, 25, 26], "cd": [5, 6, 22, 24, 25, 26], "verifi": [5, 10, 23], "point": [5, 6, 14, 22, 24, 25, 26], "browser": [5, 6, 8, 14, 19, 22, 24, 25, 26], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 26, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 26, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 32, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 10, 12, 19, 25, 27, 30, 31, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 28, 31, 32, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 26, 30, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24, 26], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 12, 14, 27, 28, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 26, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25, 26], "scrap": [5, 7, 12], "job": [5, 6, 19], "onli": [5, 6, 7, 12, 19, 21, 23, 25, 30, 32, 33, 39, 41], "import": [5, 6, 7, 10, 12, 21, 22, 24, 25, 26, 33], "record": [5, 7, 19, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25, 26], "code": [5, 34], "shell": 5, "correct": [5, 23, 41], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 26], "host": [5, 6, 7, 9, 19, 26], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23, 26], "127": [5, 7, 19], "right": [5, 6, 14, 41], "typic": [5, 14, 25, 28, 30, 39, 41], "node_export": [5, 6, 7, 9, 16, 26], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "5": [5, 6, 14, 16, 19, 26], "By": [5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 31, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": [5, 18], "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 19, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7, 19], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 10, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25, 26], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 7, 27, 32], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24, 26], "scylla_reactor_util": 5, "At": [5, 14, 24, 25, 26], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25, 26], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 28, 29, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 19, 25, 34, 38], "tabl": [5, 6, 10, 16, 27, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 26, 33, 41], "give": [5, 13, 15], "strongli": [5, 41], "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 27, 30, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 26, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 26, 32, 33], "mention": [5, 14], "previous": [5, 24, 25, 26], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 31, 33, 41], "privileg": [5, 6, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 7, 25], "laptop": 6, "48": 6, "10": [6, 10, 14, 16], "47": 6, "44": 6, "8": [6, 16, 19, 21, 25], "41": 6, "38": 6, "34": 6, "32": 6, "29": 6, "25": [6, 19], "18": 6, "avoid": [6, 14, 19, 31, 41], "root": [6, 19, 22, 24, 25, 26], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 10, 22, 24, 25, 26], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 30, 41], "higher": [6, 10, 25, 30, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 27, 28, 29], "agent": [6, 7, 8, 9, 16, 19, 26], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7, 26], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25, 26], "within": [6, 10, 14], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 38], "place": [6, 7, 8, 10, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 28, 30, 31, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 10, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25, 26], "2019": [6, 16, 38], "reach": [6, 8, 12, 30, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 30, 31, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 29, 32, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 30, 31, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "experiment": 7, "initi": 7, "stage": 7, "process": [7, 21, 33, 40], "firstli": 7, "along": 7, "env": 7, "prerequisit": 7, "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": [7, 10], "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 27, 28, 29, 30, 31, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25, 26], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 26, 34], "disk": [7, 10, 14, 19, 27, 29, 34], "possibl": [7, 10, 17, 41], "api": [7, 8, 21], "resolv": 7, "explicitli": [7, 14], "ca": 7, "optim": [7, 32, 38, 42], "drop": [7, 40, 41], "while": [7, 10, 19, 21, 22, 24, 25, 26, 33], "cdc": 7, "request": [7, 17, 40], "how": [7, 8, 10, 14, 22, 24, 25, 26, 28, 29, 30, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 10, 14, 19], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25, 26], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 26, 29], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 28, 29, 30, 34, 35, 41], "abov": [8, 22, 24, 25, 26], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 30, 38, 41], "email": [9, 10], "slack": [9, 10, 18], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11], "wrong": [10, 11, 14, 19, 25, 26, 39, 41], "shown": [10, 19, 22, 24, 25, 26], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21, 26], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "error": [10, 14, 25, 34, 35, 37], "annot": 10, "descript": [10, 34], "been": [10, 12], "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "low": [10, 41], "info": 10, "warn": [10, 34], "critic": 10, "inhibit": 10, "prioriti": 10, "mute": 10, "lower": [10, 41], "space": 10, "threshold": 10, "fire": 10, "silenc": 10, "signal": 10, "action": 10, "pager": 10, "duti": 10, "extens": 10, "easier": [10, 14], "dure": [10, 19, 22, 24, 25, 26], "practic": [10, 34, 38], "suitabl": 10, "rememb": 10, "overridden": [10, 14], "duplic": [10, 41], "rout": [10, 30, 41], "repres": 10, "tree": 10, "win": [10, 19], "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 28], "simul": 10, "actual": [10, 37], "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 32, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "shard": [12, 19, 25, 34], "dd": 12, "non": [12, 19, 21, 29, 30, 34, 38, 41], "cost": [12, 41], "skip": [12, 25], "care": [12, 27, 28, 29, 41], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "sever": [13, 15, 42], "explain": [14, 22, 24, 25, 26, 34], "intern": [14, 30, 41], "potenti": [14, 34, 41], "issu": [14, 19, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 31, 41], "tooltip": 14, "msresolut": 14, "share": [14, 26, 33], "sort": [14, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 31, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 19, 23, 25], "calcul": [14, 19, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": 14, "usual": [14, 19, 34, 41], "wrapper": 14, "re": [14, 30], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2023": 16, "2024": 16, "2018": [16, 31], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "ask": 18, "question": 18, "discuss": 18, "forum": 18, "channel": 18, "56090": 19, "old": [19, 22, 23, 24, 25, 26], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "post": 19, "past": [19, 23], "mai": [19, 33, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": 19, "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 30, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 27, 28, 29, 31, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "fallback": 19, "mechan": [19, 25, 28], "present": [19, 25], "newer": [19, 24, 25, 26], "reli": [19, 25, 41], "miss": [19, 25], "clean": 19, "recommend": [19, 22, 24, 25, 26, 41], "increas": [19, 31, 33, 41], "might": [19, 39], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25, 26], "migrat": [21, 22, 24, 26], "lose": 21, "histor": [21, 25], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25, 26], "3001": [21, 22, 24, 25, 26], "9091": [21, 22, 24, 25, 26], "9094": 21, "fail": [21, 28, 30, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25, 26], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25, 26], "back": [21, 28], "uninstal": [22, 24, 25, 26], "minor": [22, 24, 25, 26], "9095": [22, 24, 25, 26], "brows": [22, 24, 25, 26], "satisfi": [22, 24, 25, 26], "shut": [22, 24, 25, 26], "caus": [22, 24, 25, 26, 30, 41], "blackout": [22, 24, 25, 26], "normal": [22, 24, 25, 26], "oper": [22, 24, 25, 26, 34, 41], "complet": [22, 24, 25, 26], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25, 26], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 27, 34, 41], "ensur": 25, "patch": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 29], "latenc": [25, 30, 33, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 28], "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 28, 29, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "itself": 26, "almost": 26, "alwai": [26, 32], "sylladb": 26, "prevent": [26, 41], "primari": [27, 41], "kei": [27, 41], "scan": 27, "These": [27, 41], "kind": [27, 41], "bigger": 27, "replicationfactor": [28, 29], "piec": 28, "determin": [28, 29, 35, 41], "repli": [28, 29, 31, 35, 37, 41], "unavail": [28, 41], "client": [28, 31, 34, 41], "respond": 28, "accompani": 28, "deep": 28, "understand": 28, "acknowledg": 29, "coordin": [29, 30, 35, 37, 41], "hint": 29, "fact": 29, "yet": 29, "ideal": [30, 41], "resourc": [30, 41], "replic": [30, 35, 37, 41], "prepar": [30, 34, 38], "statement": [30, 32, 34, 38], "balanc": [30, 33, 34, 41], "polici": 30, "cours": 30, "intro": 30, "recap": 30, "ring": [30, 41], "architectur": 30, "chunk": [31, 41], "overal": [31, 33, 41], "thu": 31, "www": [31, 38], "07": 31, "13": 31, "effici": [31, 41], "concret": 32, "thumb": 32, "favor": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "solv": 34, "categori": [34, 41], "jump": 34, "cell": 34, "model": [34, 38, 40, 41], "awar": 34, "due": 34, "unsatisfi": 34, "faulti": 34, "cach": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "bottleneck": 38, "explan": 38, "08": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "shed": 40, "repair": 40, "queue": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "order": 41, "BY": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 13, 26], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 34, 42], "us": [2, 5, 6, 8, 12, 14, 27, 28, 29, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25, 26], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25, 26], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25, 26], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 29, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 31, 38], "node": [6, 36], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": [6, 17], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25, 26], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 26, 34, 41], "all": [7, 22, 24, 25, 26, 28], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25, 26], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 28, 29, 35, 41], "architectur": 9, "sever": 10, "ad": [10, 12, 14], "modifi": [10, 14], "tip": 10, "when": 10, "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25, 26], "limit": 14, "consist": [14, 28, 29, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25, 26], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25, 26], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25, 26], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25, 26], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25, 26], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "latenc": 19, "graph": 19, "ar": [19, 30, 31, 32, 38], "empti": 19, "reduc": 19, "total": 19, "number": [19, 26], "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25, 26], "latest": 21, "new": [21, 22, 23, 24, 25, 26], "4": [21, 25, 26], "move": [21, 22, 24, 25, 26], "old": 21, "b": [21, 26], "rollback": [21, 22, 23, 24, 25, 26], "link": [21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 38], "y": [22, 24, 25, 26], "": [22, 24, 25, 26], "i": [22, 24, 25, 26, 36], "run": [22, 24, 25, 26], "correct": [22, 24, 25, 26], "correctli": [22, 24, 26], "kill": [22, 24, 25, 26], "test": [24, 25, 26], "mode": [24, 25, 26], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "port": 26, "some": [27, 28, 29, 30, 31, 32, 35, 37], "allow": [27, 41], "filter": [27, 41], "univers": [28, 29, 30], "ani": 29, "token": [30, 41], "awar": [30, 41], "select": 31, "non": [31, 32], "page": [31, 41], "blog": [31, 38], "prepar": [32, 39, 41], "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "revers": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Some queries are non-prepared": [[32, "some-queries-are-non-prepared"]], "Some queries are not token-aware": [[30, "some-queries-are-not-token-aware"]], "University link": [[30, "university-link"]], "Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Some SELECT queries are non-paged": [[31, "some-select-queries-are-non-paged"]], "Blog-post Links": [[31, "blog-post-links"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Upgrade Procedure": [[22, "upgrade-procedure"], [24, "upgrade-procedure"], [26, "upgrade-procedure"], [23, "upgrade-procedure"], [25, "upgrade-procedure"], [21, "upgrade-procedure"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[22, "setting-the-server-s-files"], [24, "setting-the-server-s-files"], [26, "setting-the-server-s-files"], [25, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[22, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[22, "validate-the-version-installed-correctly"], [24, "validate-the-version-installed-correctly"], [26, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[22, "kill-all-containers"], [24, "kill-all-containers"], [26, "kill-all-containers"], [25, "kill-all-containers"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Related Links": [[22, "related-links"], [24, "related-links"], [26, "related-links"], [23, "related-links"], [25, "related-links"], [21, "related-links"]], "Some queries use Consistency Level: ANY": [[29, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[29, "link-to-scylla-university"], [28, "link-to-scylla-university"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Rollback to version 3.x": [[24, "rollback-to-version-3-x"], [25, "rollback-to-version-3-x"]], "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b": [[26, "upgrade-guide-scylladb-monitoring-4-x-a-to-scylladb-monitoring-4-y-b"]], "Install 4.y.b (The new version)": [[26, "install-4-y-b-the-new-version"]], "Validate the port numbers": [[26, "validate-the-port-numbers"]], "Killing the new 4.y.b Monitoring stack in testing mode": [[26, "killing-the-new-4-y-b-monitoring-stack-in-testing-mode"]], "Move to version 4.y.b (the new version)": [[26, "move-to-version-4-y-b-the-new-version"]], "Rollback to version 4.x.a": [[26, "rollback-to-version-4-x-a"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[23, "install-the-new-monitoring-stack"], [21, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[23, "validate-the-upgrade"], [21, "validate-the-upgrade"]], "Rollback": [[23, "rollback"], [21, "rollback"]], "Some queries use ALLOW FILTERING": [[27, "some-queries-use-allow-filtering"]], "Some queries use Consistency Level: ALL": [[28, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[19, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[17, "prometheus-api"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alerts severity": [[10, "alerts-severity"]], "Adding Alerts": [[10, "adding-alerts"]], "Modifying Alerts": [[10, "modifying-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "System Overload": [[40, "system-overload"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "ScyllaDB Monitoring Stack": [[9, "scylladb-monitoring-stack"], [1, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Minimal Production System Recommendations": [[4, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[4, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[4, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.6/sitemap.xml b/branch-4.6/sitemap.xml new file mode 100644 index 000000000..d0c11f1e4 --- /dev/null +++ b/branch-4.6/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.6/troubleshooting/index.html b/branch-4.6/troubleshooting/index.html new file mode 100644 index 000000000..8be223398 --- /dev/null +++ b/branch-4.6/troubleshooting/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Troubleshooting Guide for Scylla Monitoring Stack

                                +
                                +
                                +

                                Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/troubleshooting/monitor-troubleshoot.html b/branch-4.6/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..68a102bf5 --- /dev/null +++ b/branch-4.6/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,901 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Troubleshoot Scylla Monitoring Stack

                                +

                                This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                                +
                                +

                                Problem

                                +
                                +

                                Scylla-Manager 2.2 with Duplicate information

                                +

                                Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                                +
                                  +
                                • For Manager server: from 56090 to 5090

                                • +
                                • For Manager Agent: from 56090 to 5090

                                • +
                                +

                                For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                                +

                                However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                                +

                                The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                                +

                                Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                                +
                                +
                                +

                                A Container Fails To Start

                                +

                                When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                                +
                                Wait for Prometheus container to start........Error: Prometheus container failed to start
                                +
                                +
                                +

                                Should this happen, check the Docker logs for more information.

                                +
                                docker logs aprom
                                +
                                +
                                +

                                Usually the reason for the failure is described in the logs.

                                +
                                +
                                +

                                Files And Directory Permissions

                                +
                                +

                                Note

                                +

                                Avoid running Docker containers as root.

                                +
                                +

                                The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                                +

                                If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                                +
                                +

                                Note

                                +

                                If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                                +
                                +

                                For example if your Prometheus data directory is /prom-data and you are using centos user

                                +
                                ls -la /|grep prom-data
                                +
                                +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                                +
                                +sudo chown -R centos:centos /prom-data
                                +
                                +ls -la /|grep prom-data
                                +
                                +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                                +
                                +
                                +
                                +
                                +

                                No Data Points

                                +

                                No data points on all data charts.

                                +
                                +

                                Solution

                                +

                                If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                                +
                                  +
                                1. Login to the Prometheus console:

                                2. +
                                3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                                4. +
                                5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                                6. +
                                +
                                +
                                  +
                                • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                                • +
                                • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                                • +
                                • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                                • +
                                +
                                +

                                For example:

                                +
                                ./start-all.sh -v 3.1
                                +
                                +
                                +

                                More on start-all.sh options.

                                +
                                +
                                +
                                +

                                Grafana Chart Shows Error (!) Sign

                                +

                                Run this procedure on the Scylla Monitoring Stack server.

                                +

                                If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                                +
                                +

                                Solution

                                +

                                On the Scylla Monitoring Stack server:

                                +
                                  +
                                1. Check Prometheus is running using docker ps.

                                2. +
                                +
                                  +
                                • If it is not running check the prometheus.yml for errors.

                                • +
                                +

                                For example:

                                +
                                CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                                +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                                +
                                +
                                +
                                  +
                                • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                                • +
                                +
                                +
                                +
                                +

                                Grafana Shows Server Level Metrics, but not Scylla Metrics

                                +

                                Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                                +
                                +

                                Solution

                                +
                                  +
                                • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                                • +
                                +

                                For example

                                +
                                curl 172.17.0.2:9180/metrics
                                +
                                +
                                +
                                +
                                +
                                +

                                Grafana Shows Scylla Metrics, but not Server Level Metrics

                                +

                                Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                                +
                                +

                                Solution

                                +

                                1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                                +
                                  +
                                1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                                2. +
                                +
                                +
                                +

                                Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                                +

                                While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                                +

                                If the node_exporter service is not starting it may need to be updated manually.

                                +

                                Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                                +
                                +
                                +
                                +

                                Latencies Graphs Are empty

                                +

                                Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                                +

                                During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                                +

                                Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                                +

                                If only the latency graphs are missing, it is because of missing recording rules.

                                +

                                This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                                +

                                If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                                +
                                +
                                +

                                Reducing the total number of metrics

                                +

                                In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                                +
                                +

                                Remove interrupts from node_exporter

                                +

                                By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                                +
                                +
                                +
                                +

                                Working with Wireshark

                                +

                                No metrics shown in the Scylla Monitoring Stack.

                                +
                                  +
                                1. Install wireshark

                                2. +
                                +

                                2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                                +

                                For example:

                                +
                                tshark -i eth0 -f "dst port 9180"
                                +
                                +
                                +

                                Capture from Scylla node towards Scylla Monitoring Stack server.

                                +

                                In this example, Scylla is running.

                                +
                                Monitor ip        Scylla node ip
                                +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                                +
                                +
                                +

                                In this example, Scylla is not running

                                +
                                Monitor ip        Scylla node ip
                                +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                                +
                                +
                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/index.html b/branch-4.6/upgrade/index.html new file mode 100644 index 000000000..fdcd0baec --- /dev/null +++ b/branch-4.6/upgrade/index.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Upgrade Scylla Monitoring Stack

                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..76d8d4b90 --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,809 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                                +

                                Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                                +
                                +

                                Upgrade Procedure

                                +
                                +

                                1. Upgrade to the latest 1.x version

                                +

                                Before starting the upgrade procedure, make sure you are running the latest 1.x version

                                +
                                +
                                +

                                2. Install the new monitoring stack

                                +
                                  +
                                1. Download the 2.x version from the release page.

                                2. +
                                3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                                4. +
                                5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                                  +
                                    +
                                  • scylla_servers.yml

                                  • +
                                  • scylla_manager_servers.yml

                                  • +
                                  • node_exporter_servers.yml

                                  • +
                                  +
                                6. +
                                7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                                8. +
                                +
                                ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                                +
                                +
                                +
                                +

                                Note

                                +

                                Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                                +
                                +

                                While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                                +
                                ./kill-all.sh -g 3001 -p 9091 -m 9094
                                +
                                +
                                +
                                +

                                Validation

                                +

                                Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                                +
                                +
                                +
                                +

                                3. Alerting Rules

                                +

                                Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                                +
                                +
                                +

                                4. Moving to Prometheus 2.x

                                +

                                Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                                +

                                Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                                +
                                +

                                a. Set the old system

                                +

                                The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                                +
                                  +
                                • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                                • +
                                • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                                • +
                                +
                                +

                                Note

                                +

                                After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                                +
                                +
                                +
                                +

                                b. Set the new system

                                +

                                The following step will allow the new monitoring system to read historical metrics from the old system.

                                +
                                  +
                                • In the Prometheus prometheus.yml.template file add the following at the end:

                                • +
                                +
                                remote_read:
                                +  - url: "http://{ip}:9111/api/v1/read"
                                +
                                +
                                +

                                Where {ip} is the ip of the old system.

                                +
                                  +
                                • restart the new stack

                                • +
                                +
                                +
                                +
                                +

                                Validate the upgrade

                                +

                                You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                                +
                                +
                                +
                                +

                                Rollback

                                +

                                In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..3bedf866b --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,803 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                                +
                                +

                                Upgrade Procedure

                                +

                                We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                +

                                Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                +
                                +

                                Install 2.y (The new version)

                                +
                                wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                                +unzip scylla-monitoring-2.y.zip
                                +cd scylla-monitoring-scylla-monitoring-2.y/
                                +
                                +
                                +

                                Replace “y” with the new minor release number, for example, 2.1.zip

                                +
                                +
                                +

                                Setting the server’s files

                                +

                                Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                                +
                                cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                                +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                                +
                                +
                                +
                                +
                                +

                                Validate the new version is running the correct version

                                +

                                Starting from Scylla-Monitoring version 2.2, you can run:

                                +
                                ./start-all.sh --version
                                +
                                +
                                +

                                To validate the Scylla-Monitoring version.

                                +
                                +
                                +

                                Validate the version installed correctly

                                +

                                To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                                +
                                ./start-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                Browse to http://{ip}:9091 +And check the Grafana dashboard

                                +

                                Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                                +
                                +

                                Caution

                                +

                                Important: do not use the local dir flag when testing!

                                +
                                +

                                When you are satisfied with the data in the dashboard, you can shut down the containers.

                                +
                                +

                                Caution

                                +

                                Important: Do not kill the 2.x version that is currently running.

                                +
                                +

                                Use the following command to kill the containers:

                                +
                                ./kill-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                You can start and stop the new 2.y version while testing.

                                +
                                +
                                +

                                Move to version 2.y (the new version)

                                +

                                Note: migrating will cause a few seconds of blackout in the system.

                                +

                                We assume that you are using external volume to store the metrics data.

                                +
                                +

                                Kill all containers

                                +

                                Follow the instruction on how to kill the 2.y version when in testing mode.

                                +

                                To kill the 2.x version containers, run:

                                +
                                ./kill-all.sh
                                +
                                +
                                +

                                Start version 2.y in normal mode

                                +

                                From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                                +
                                ./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +

                                Point your browser to http://{ip}:3000 and see that the data is there.

                                +
                                +
                                +
                                +

                                Rollback to version 2.x

                                +

                                To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                                +

                                To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                                +
                                ./kill-all.sh
                                +cd /path/to/scylla-grafana-2.x/
                                +./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +
                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..4a8927b86 --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,767 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                                +

                                Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                                +
                                +

                                Upgrade Procedure

                                +
                                +

                                1. Validate node_exporter version

                                +

                                Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                                +

                                If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                                +
                                +
                                +

                                2. Install the new monitoring stack

                                +
                                  +
                                1. Download the 3.x version from the release page.

                                2. +
                                3. Unzip it into a different directory.

                                4. +
                                5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                                  +
                                    +
                                  • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                                  • +
                                  • scylla_manager_servers.yml

                                  • +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                                  +
                                  +
                                  +
                                6. +
                                7. Stop the old monitoring stack

                                  +
                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +
                                  +
                                8. +
                                9. Start the new monitoring stack

                                  +
                                  +
                                  ./start-all.sh -d /prometheus-data-path
                                  +
                                  +
                                  +
                                  +
                                10. +
                                +
                                +
                                +

                                Validate the upgrade

                                +

                                You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                                +

                                Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                                +
                                +
                                +
                                +

                                Rollback

                                +

                                To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..999ec2528 --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                                +
                                +

                                Upgrade Procedure

                                +

                                We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                +

                                Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                +
                                +

                                Install 3.y (The new version)

                                +
                                wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                                +unzip scylla-monitoring-3.y.zip
                                +cd scylla-monitoring-scylla-monitoring-3.y/
                                +
                                +
                                +

                                Replace “y” with the new minor release number, for example, 3.0.1.zip

                                +
                                +
                                +

                                Setting the server’s files

                                +

                                Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                +
                                cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                +
                                +
                                +
                                +
                                +

                                Validate the new version is running the correct version

                                +

                                Starting from Scylla-Monitoring version 2.2, you can run:

                                +
                                ./start-all.sh --version
                                +
                                +
                                +

                                To validate the Scylla-Monitoring version.

                                +
                                +
                                +

                                Validate the version installed correctly

                                +

                                To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                                +
                                ./start-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                Browse to http://{ip}:9091 +And check the Grafana dashboard

                                +

                                Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                +
                                +

                                Caution

                                +

                                Important: do not use the local dir flag when testing!

                                +
                                +

                                When you are satisfied with the data in the dashboard, you can shut down the containers.

                                +
                                +

                                Caution

                                +

                                Important: Do not kill the 3.x version that is currently running.

                                +
                                +
                                +
                                +

                                Killing the new 3.y Monitoring stack in testing mode

                                +

                                Use the following command to kill the containers:

                                +
                                ./kill-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                You can start and stop the new 3.y version while testing.

                                +
                                +
                                +

                                Move to version 3.y (the new version)

                                +

                                Note: migrating will cause a few seconds of blackout in the system.

                                +

                                We assume that you are using external volume to store the metrics data.

                                +
                                +

                                Kill all containers

                                +

                                At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                +

                                Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                                +

                                kill the older 3.x version containers by running:

                                +
                                ./kill-all.sh
                                +
                                +
                                +

                                Start version 3.y in normal mode

                                +

                                From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                                +
                                ./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +

                                Point your browser to http://{ip}:3000 and see that the data is there.

                                +
                                +
                                +
                                +

                                Rollback to version 3.x

                                +

                                To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                +

                                To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                                +
                                ./kill-all.sh
                                +cd /path/to/scylla-grafana-3.x/
                                +./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +
                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..fbf9cef33 --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,954 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                                +
                                +

                                Upgrade Procedure

                                +

                                We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                                +

                                Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                                +
                                +

                                Install 4.y (The new version)

                                +
                                wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                                +unzip scylla-monitoring-4.y.zip
                                +cd scylla-monitoring-scylla-monitoring-4.y/
                                +
                                +
                                +

                                Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                                +
                                +
                                +

                                Setting the server’s files

                                +

                                Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                +
                                cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                +
                                +
                                +
                                +
                                +

                                Validate the new version is running the correct version

                                +

                                run:

                                +
                                ./start-all.sh --version
                                +
                                +
                                +

                                To validate the Scylla-Monitoring version.

                                +
                                +
                                +
                                +

                                Running in test mode

                                +

                                This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                                +
                                +

                                Running second monitoring stack

                                +

                                We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                                +
                                ./start-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                Browse to http://{ip}:9091 and check the Grafana dashboard.

                                +

                                Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                +
                                +

                                Caution

                                +

                                Important: do not use the local dir flag when testing!

                                +
                                +

                                When you are satisfied with the data in the dashboard, you can shut down the containers.

                                +
                                +

                                Caution

                                +

                                Important: Do not kill the 3.x version that is currently running!

                                +
                                +
                                +
                                +

                                Killing the new 4.y Monitoring stack in testing mode

                                +

                                Use the following command to kill the containers:

                                +
                                ./kill-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                You can start and stop the new 4.y version while testing.

                                +
                                +
                                +
                                +

                                Migrating

                                +
                                +

                                Move to version 4.y (the new version)

                                +

                                Note: migrating will cause a few seconds of blackout in the system.

                                +

                                We assume that you are using external volume to store the metrics data.

                                +
                                +

                                Backup

                                +

                                We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                                +
                                +
                                +

                                Kill all containers

                                +

                                At this point you have two monitoring stacks installed with the older version running.

                                +

                                If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                                +

                                kill the older 3.x version containers by running:

                                +
                                ./kill-all.sh
                                +
                                +
                                +

                                Start version 4.y in normal mode

                                +

                                From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                                +
                                ./start-all.sh -d /path/to/copy/data/dir
                                +
                                +
                                +

                                Point your browser to http://{ip}:3000 and see that the data is there.

                                +
                                +
                                +
                                +

                                Rollback to version 3.x

                                +

                                To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                +

                                To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                                +
                                ./kill-all.sh
                                +cd /path/to/scylla-grafana-3.x/
                                +./start-all.sh -d /path/to/original/data/dir
                                +
                                +
                                +
                                +
                                +
                                +

                                Post-installation: Metrics back-filling

                                +

                                Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                                +

                                For example, this is a recording rule that calculates the p99 write latency:

                                +
                                - record: wlatencyp99
                                +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                                +  labels:
                                +    by: "instance,shard"
                                +
                                +
                                +

                                For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                                +

                                Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                                +
                                +
                                +

                                Note

                                +

                                If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                                +
                                +
                                +
                                +../_images/before-backfilling.png +
                                +

                                This is an example of missing latency graph

                                +
                                +
                                +

                                The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                                +

                                For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                                +

                                In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                                +

                                The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                                +
                                +

                                Determine the backfilling period

                                +

                                When you run the backfilling process you need to determine the start time and end time.

                                +
                                +

                                Determine the start time

                                +

                                The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                                +

                                If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                                +

                                For the rest of this example, we will assume that your retention time is 360 days.

                                +
                                +
                                +

                                Determine the end time

                                +

                                Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                                +

                                If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                                +

                                That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                                +

                                The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                                +
                                +
                                +
                                +

                                Backfilling Process

                                +
                                +

                                backup

                                +

                                If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                                +

                                To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                                +
                                +
                                +

                                Restart the monitoring stack

                                +

                                You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                                +

                                -b "--storage.tsdb.allow-overlapping-blocks"

                                +
                                +
                                +

                                Create the data files

                                +

                                We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                                +

                                The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                                +

                                Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                                +
                                docker exec -it aprom sh
                                +cd /prometheus/data/
                                +promtool tsdb create-blocks-from rules \
                                +--start $start \
                                +--end $end \
                                +--url http://localhost:9090 \
                                +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                                +
                                +
                                +

                                It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                                +
                                +
                                +

                                Note

                                +

                                Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                                +
                                +
                                +
                                +
                                +

                                Copy the data files

                                +

                                Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                                +

                                Copy the data files to the Prometheus directory:

                                +
                                cp data/* .
                                +
                                +
                                +

                                The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                                +

                                Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                                +
                                +../_images/after-backfilling.jpg +
                                +

                                Un example: after loading half of the data

                                +
                                +
                                +
                                +
                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..fbb241e25 --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,826 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1.

                                +
                                +

                                Upgrade Procedure

                                +

                                We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                +

                                Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                +
                                +

                                Install 4.y.b (The new version)

                                +
                                wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip
                                +unzip scylla-monitoring-4.y.b.zip
                                +cd scylla-monitoring-scylla-monitoring-4.y.b/
                                +
                                +
                                +

                                Replace “y” with the new minor release number, for example, 4.0.1.zip

                                +
                                +
                                +

                                Setting the server’s files

                                +

                                Copy the target files scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                +
                                cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/
                                +cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/
                                +
                                +
                                +
                                +

                                Validate the port numbers

                                +

                                ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent.

                                +

                                Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target.

                                +
                                +

                                Caution

                                +

                                As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics.

                                +
                                +
                                +
                                +
                                +

                                Validate the new version is running the correct version

                                +

                                Run:

                                +
                                ./start-all.sh --version
                                +
                                +
                                +

                                To validate the Scylla-Monitoring version.

                                +
                                +
                                +

                                Validate the version installed correctly

                                +

                                To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack.

                                +
                                ./start-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                Browse to http://{ip}:9091 +And check the Grafana dashboard

                                +

                                Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                +
                                +

                                Caution

                                +

                                Important: do not use the local dir flag when testing!

                                +
                                +

                                When you are satisfied with the data in the dashboard, you can shut down the containers.

                                +
                                +

                                Caution

                                +

                                Important: Do not kill the 4.x.a version that is currently running.

                                +
                                +
                                +
                                +

                                Killing the new 4.y.b Monitoring stack in testing mode

                                +

                                Use the following command to kill the containers:

                                +
                                ./kill-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                You can start and stop the new 4.y.b version while testing.

                                +
                                +
                                +

                                Move to version 4.y.b (the new version)

                                +

                                Note: migrating will cause a few seconds of blackout in the system.

                                +

                                We assume that you are using external volume to store the metrics data.

                                +
                                +

                                Kill all containers

                                +

                                At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                +

                                Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y.b Monitoring stack in testing mode +in the previous section

                                +

                                kill the older 4.x.a version containers by running:

                                +
                                ./kill-all.sh
                                +
                                +
                                +

                                Start version 4.y.b in normal mode

                                +

                                From the new root of the scylla-monitoring-scylla-monitoring-4.y.b run

                                +
                                ./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +

                                Point your browser to http://{ip}:3000 and see that the data is there.

                                +
                                +
                                +
                                +

                                Rollback to version 4.x.a

                                +

                                To rollback during the testing mode, follow Killing the new 4.y.b Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                +

                                To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run:

                                +
                                ./kill-all.sh
                                +cd /path/to/scylla-grafana-4.x.a/
                                +./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +
                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.6/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..284de27bf --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Some queries use ALLOW FILTERING

                                +

                                Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                                +

                                These kinds of queries can create a bigger load on Scylla, and should be used with care.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlCLAll.html b/branch-4.6/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..8585f516b --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Some queries use Consistency Level: ALL

                                +

                                Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                                +

                                Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                                +

                                Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlCLAny.html b/branch-4.6/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..444303b0f --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Some queries use Consistency Level: ANY

                                +

                                Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                                +

                                Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.6/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..f7ca95fb9 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Some queries are not token-aware

                                +

                                Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                                +

                                Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlNonPaged.html b/branch-4.6/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..b0fce8bee --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Some SELECT queries are non-paged

                                +

                                By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                                +
                                +

                                Blog-post Links

                                +

                                https://www.scylladb.com/2018/07/13/efficient-query-paging/

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.6/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..0d7dd814c --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Some queries are non-prepared

                                +

                                Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/heavyCompaction.html b/branch-4.6/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..534656d7d --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,706 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Compaction takes lots of memory and CPU

                                +

                                ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                                +

                                If this is the case, you can do one of the following:

                                +
                                  +
                                • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                                  +
                                  +
                                    +
                                  • In the scylla.yml configuration file: compaction_static_shares: 100

                                  • +
                                  • In the command line when starting ScyllaDB: --compaction-static-shares 100

                                  • +
                                  +
                                  +

                                  You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                                  +
                                • +
                                • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                                • +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/index.html b/branch-4.6/use-monitoring/advisor/index.html new file mode 100644 index 000000000..047277446 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/index.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Stack Advisor

                                +
                                +
                                +

                                The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                                +
                                +

                                The Advisor section

                                +
                                +../../_images/advisor_panel.png +
                                +

                                The Advisor section

                                +
                                +
                                +

                                The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                                +

                                For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                                +

                                Each Advisor issue is explained in detail:

                                + +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/nodeCLErrors.html b/branch-4.6/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..c1b54e6c0 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Some operation failed due to unsatisfied consistency level

                                +

                                ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                                +

                                For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                                +

                                When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/nodeIOErrors.html b/branch-4.6/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..14021f84c --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                I/O Errors can indicate a node with a faulty disk

                                +

                                I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.6/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..3314521b7 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Some operations failed on the replica side

                                +

                                ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                                +

                                An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.6/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..1f756fdbf --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                CQL queries are not balanced among shards

                                +

                                For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                                +

                                There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                                +
                                +

                                Blog post link

                                +

                                https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.6/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..f15382a99 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                Prepared statements cache eviction

                                +

                                Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                                +
                                  +
                                • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                                • +
                                • The prepared statements cache might be too small for the number of prepared statements.

                                • +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/systemOverload.html b/branch-4.6/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..a66c6eaf3 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                System Overload

                                +

                                There could be multiple indications that a system is overloaded:

                                +
                                  +
                                • Timeouts

                                • +
                                • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                                • +
                                • CPU at 100% when no background process (like compaction or repair) runs.

                                • +
                                • Queues are getting filled.

                                • +
                                +

                                If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/cql-optimization.html b/branch-4.6/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..8972fe549 --- /dev/null +++ b/branch-4.6/use-monitoring/cql-optimization.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + + + +
                                +

                                The CQL Optimization

                                +

                                The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                                +
                                +../_images/cql_optimization_master.png +
                                +

                                The CQL Dashboard

                                +
                                +
                                +

                                The upper part of the dashboard holds CQL related metrics.

                                +

                                The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                                +
                                +

                                Note

                                +

                                Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                                +
                                +

                                The following sections describe each of the dashboard’s panel

                                +
                                +

                                Prepared Statements

                                +

                                Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                                +

                                Using prepared statements has the following benefits:

                                +
                                  +
                                • The database only needs to parse the query once

                                • +
                                • The driver can route the query to the right node

                                • +
                                • Using place-holders and values is safer and prevents CQL-Injection

                                • +
                                +

                                The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                                +

                                The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                                +
                                +
                                +

                                Token Aware

                                +

                                Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                                +

                                Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                                +

                                The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                                +

                                The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                                +
                                +
                                +

                                Paged Queries

                                +

                                By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                                +

                                The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                                +

                                The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                                +
                                +
                                +

                                Reversed CQL Reads

                                +

                                ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                                +

                                We strongly recommend using use the correct ordering. +Querying with an order different than the order the CLUSTERING ORDER BY was defined is supported, but not advisable.

                                +

                                For example, look at the following table:

                                +
                                CREATE TABLE ks1.table_demo (
                                +   category text,
                                +   type int,
                                +   PRIMARY KEY (category, type))
                                +WITH CLUSTERING ORDER BY (type DESC);
                                +
                                +
                                +

                                The following query uses reverse order:

                                +
                                select * from ks1.table_demo where category='cat1' order by type ASC;
                                +
                                +
                                +

                                The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                                +

                                The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                                +
                                +
                                +

                                ALLOW FILTERING

                                +

                                Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                                +

                                These kinds of queries can create a big load on the system, and should be used with care.

                                +

                                The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                                +

                                The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                                +

                                The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                                +

                                The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                                +

                                The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                                +
                                +
                                +

                                Consistency Level

                                +

                                Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                                +

                                The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                                +

                                Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                                +

                                The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                                +

                                The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                                +

                                The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                                +

                                The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                                +
                                +
                                +

                                Cross DC

                                +

                                Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                                +
                                +
                                +

                                Cross DC Consistency Level

                                +

                                Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                                +
                                +
                                +

                                Cross DC read requests

                                +
                                +

                                Note

                                +

                                The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                                +
                                +

                                In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                                +

                                The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/index.html b/branch-4.6/use-monitoring/index.html new file mode 100644 index 000000000..f3334e77e --- /dev/null +++ b/branch-4.6/use-monitoring/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + +
                                +

                                Caution

                                +

                                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                +
                                + + + +
                                + +
                                + +
                                +

                                Using Scylla Monitoring Stack

                                +
                                +
                                +

                                There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.7/.buildinfo b/branch-4.7/.buildinfo new file mode 100644 index 000000000..999baa1dc --- /dev/null +++ b/branch-4.7/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 00a8f87e47aea08bf811ff5385688df4 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.7/.doctrees/common/monitor-description.doctree b/branch-4.7/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..ae0495425 Binary files /dev/null and b/branch-4.7/.doctrees/common/monitor-description.doctree differ diff --git a/branch-4.7/.doctrees/environment.pickle b/branch-4.7/.doctrees/environment.pickle new file mode 100644 index 000000000..74a68ed6f Binary files /dev/null and b/branch-4.7/.doctrees/environment.pickle differ diff --git a/branch-4.7/.doctrees/index.doctree b/branch-4.7/.doctrees/index.doctree new file mode 100644 index 000000000..3f7e7c686 Binary files /dev/null and b/branch-4.7/.doctrees/index.doctree differ diff --git a/branch-4.7/.doctrees/install/docker-compose.doctree b/branch-4.7/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..26a8ad4af Binary files /dev/null and b/branch-4.7/.doctrees/install/docker-compose.doctree differ diff --git a/branch-4.7/.doctrees/install/index.doctree b/branch-4.7/.doctrees/install/index.doctree new file mode 100644 index 000000000..fc8ee854e Binary files /dev/null and b/branch-4.7/.doctrees/install/index.doctree differ diff --git a/branch-4.7/.doctrees/install/min-prod-hw.doctree b/branch-4.7/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..1e8d297d1 Binary files /dev/null and b/branch-4.7/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.7/.doctrees/install/monitor-without-docker.doctree b/branch-4.7/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..341aa7413 Binary files /dev/null and b/branch-4.7/.doctrees/install/monitor-without-docker.doctree differ diff --git a/branch-4.7/.doctrees/install/monitoring-stack.doctree b/branch-4.7/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..a12843386 Binary files /dev/null and b/branch-4.7/.doctrees/install/monitoring-stack.doctree differ diff --git a/branch-4.7/.doctrees/install/start-all.doctree b/branch-4.7/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..f1e9c1eb8 Binary files /dev/null and b/branch-4.7/.doctrees/install/start-all.doctree differ diff --git a/branch-4.7/.doctrees/install/thanos.doctree b/branch-4.7/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..d8b89e3fb Binary files /dev/null and b/branch-4.7/.doctrees/install/thanos.doctree differ diff --git a/branch-4.7/.doctrees/intro.doctree b/branch-4.7/.doctrees/intro.doctree new file mode 100644 index 000000000..dda20738a Binary files /dev/null and b/branch-4.7/.doctrees/intro.doctree differ diff --git a/branch-4.7/.doctrees/procedures/alerts/alerting.doctree b/branch-4.7/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..eed77d36e Binary files /dev/null and b/branch-4.7/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.7/.doctrees/procedures/alerts/index.doctree b/branch-4.7/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..72adea218 Binary files /dev/null and b/branch-4.7/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.7/.doctrees/procedures/datadog/cloud-integration.doctree b/branch-4.7/.doctrees/procedures/datadog/cloud-integration.doctree new file mode 100644 index 000000000..c69494aee Binary files /dev/null and b/branch-4.7/.doctrees/procedures/datadog/cloud-integration.doctree differ diff --git a/branch-4.7/.doctrees/procedures/datadog/index.doctree b/branch-4.7/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..40fe64111 Binary files /dev/null and b/branch-4.7/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.7/.doctrees/procedures/index.doctree b/branch-4.7/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..ab3c4f425 Binary files /dev/null and b/branch-4.7/.doctrees/procedures/index.doctree differ diff --git a/branch-4.7/.doctrees/procedures/updating-dashboard.doctree b/branch-4.7/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..75b4a8b7f Binary files /dev/null and b/branch-4.7/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/branch-4.7/.doctrees/reference/index.doctree b/branch-4.7/.doctrees/reference/index.doctree new file mode 100644 index 000000000..031bcb321 Binary files /dev/null and b/branch-4.7/.doctrees/reference/index.doctree differ diff --git a/branch-4.7/.doctrees/reference/matrix.doctree b/branch-4.7/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..ed287e6bb Binary files /dev/null and b/branch-4.7/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.7/.doctrees/reference/monitoring-apis.doctree b/branch-4.7/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..afed75d0a Binary files /dev/null and b/branch-4.7/.doctrees/reference/monitoring-apis.doctree differ diff --git a/branch-4.7/.doctrees/troubleshooting/index.doctree b/branch-4.7/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..f4eb3c7e4 Binary files /dev/null and b/branch-4.7/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.7/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/branch-4.7/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..3d8710933 Binary files /dev/null and b/branch-4.7/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/branch-4.7/.doctrees/upgrade/index.doctree b/branch-4.7/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..44b4c4135 Binary files /dev/null and b/branch-4.7/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..046af7703 Binary files /dev/null and b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..4d00bfeaa Binary files /dev/null and b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..324dce6c2 Binary files /dev/null and b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..26dcb6e14 Binary files /dev/null and b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..b2cb9639c Binary files /dev/null and b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..99b3d16bc Binary files /dev/null and b/branch-4.7/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..6ce5f5e99 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..3269aaaf4 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..4009f1f10 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..46e9e9899 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..e2d6c7eb4 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..dc7b7682c Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..3b1eb9d6c Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..8a90b852e Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..038c38eb4 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..4c3393743 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..7dca6c392 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..93eef28c7 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..8bda87ae1 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.7/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..09cfe6a1b Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/cql-optimization.doctree b/branch-4.7/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..35e921338 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/branch-4.7/.doctrees/use-monitoring/index.doctree b/branch-4.7/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..5c20f9d79 Binary files /dev/null and b/branch-4.7/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.7/.nojekyll b/branch-4.7/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.7/404.html b/branch-4.7/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.7/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                                +

                                404

                                +

                                The ScyllaDB monster ate your page!

                                +

                                + Home +

                                +
                                + + + \ No newline at end of file diff --git a/branch-4.7/CNAME b/branch-4.7/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.7/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.7/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.7/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..73651eed6 --- /dev/null +++ b/branch-4.7/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,495 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_healthcheck_cql_status_ag + expr: sum(scylla_manager_healthcheck_cql_status) by(cluster) + labels: + by: "cluster" + status: "1" + dd: "1" + - record: scylla_manager_healthcheck_cql_status_ag + expr: count(scylla_manager_healthcheck_cql_status==0) by(cluster) + labels: + by: "cluster" + status: "0" + dd: "1" diff --git a/branch-4.7/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.7/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.7/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.7/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.7/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/branch-4.7/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.7/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.7/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/branch-4.7/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.7/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/branch-4.7/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/branch-4.7/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/branch-4.7/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.7/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/branch-4.7/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.7/_images/1.png b/branch-4.7/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.7/_images/1.png differ diff --git a/branch-4.7/_images/2.png b/branch-4.7/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.7/_images/2.png differ diff --git a/branch-4.7/_images/3.png b/branch-4.7/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.7/_images/3.png differ diff --git a/branch-4.7/_images/advisor_panel.png b/branch-4.7/_images/advisor_panel.png new file mode 100644 index 000000000..89b9a5950 Binary files /dev/null and b/branch-4.7/_images/advisor_panel.png differ diff --git a/branch-4.7/_images/after-backfilling.jpg b/branch-4.7/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.7/_images/after-backfilling.jpg differ diff --git a/branch-4.7/_images/alertmanager.png b/branch-4.7/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.7/_images/alertmanager.png differ diff --git a/branch-4.7/_images/before-backfilling.png b/branch-4.7/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.7/_images/before-backfilling.png differ diff --git a/branch-4.7/_images/cql_optimization_master.png b/branch-4.7/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.7/_images/cql_optimization_master.png differ diff --git a/branch-4.7/_images/datadog.png b/branch-4.7/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.7/_images/datadog.png differ diff --git a/branch-4.7/_images/grafana.png b/branch-4.7/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.7/_images/grafana.png differ diff --git a/branch-4.7/_images/monitor.png b/branch-4.7/_images/monitor.png new file mode 100644 index 000000000..cf691ecb3 Binary files /dev/null and b/branch-4.7/_images/monitor.png differ diff --git a/branch-4.7/_images/monitoring_stack.png b/branch-4.7/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.7/_images/monitoring_stack.png differ diff --git a/branch-4.7/_images/monitoring_stack1.png b/branch-4.7/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.7/_images/monitoring_stack1.png differ diff --git a/branch-4.7/_sources/common/monitor-description.rst.txt b/branch-4.7/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.7/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.7/_sources/index.rst.txt b/branch-4.7/_sources/index.rst.txt new file mode 100644 index 000000000..3dbe94edd --- /dev/null +++ b/branch-4.7/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.7/_sources/install/docker-compose.rst.txt b/branch-4.7/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.7/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.7/_sources/install/index.rst.txt b/branch-4.7/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/branch-4.7/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.7/_sources/install/min-prod-hw.rst.txt b/branch-4.7/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..6fda62cc1 --- /dev/null +++ b/branch-4.7/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                                + + + + + + + + + + + +
                                # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                00
                                + +
                                + \ No newline at end of file diff --git a/branch-4.7/_sources/install/monitor-without-docker.rst.txt b/branch-4.7/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..3a1f7e7c3 --- /dev/null +++ b/branch-4.7/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,492 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                                `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.26.0 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.26.0.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.26.0.linux-amd64/ + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.49.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.49.1/prometheus-2.49.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories + +.. code-block:: shell + + sudo mkdir -p /prometheus/data + sudo mkdir -p /etc/prometheus/prom_rules/ + sudo mkdir -p /etc/scylla.d/prometheus/ + +.. note:: To run Promethues as non-root user, you would need to give read write and execute permissions to those directories. + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat /etc/scylla.d/prometheus/scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + cat /etc/scylla.d/prometheus/scylla_manager_server.yml + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd cd prometheus-2.49.1.linux-amd64/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 10.3.3 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different, we will assume that you used yum/dnf install. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +4. Provision the Dashboards + +For example Scylla Open-source version 5.4 and Scylla manager version 2.4 + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.5.4.yaml + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + + +Edit the ``load.*`` you just copied. For example + +.. code-block:: shell + + $ cat /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml + apiVersion: 1 + + providers: + - name: 'manager_3.3' + orgId: 1 + folder: '' + type: file + disableDeletion: false + allowUiUpdates: true + updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards + options: + path: /var/lib/grafana/dashboards/manager_3.3 + + $ cat /etc/grafana/provisioning/dashboards/load.5.4.yaml + apiVersion: 1 + + providers: + - name: '5.4' + orgId: 1 + folder: '' + type: file + disableDeletion: false + allowUiUpdates: true + updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards + options: + path: /var/lib/grafana/dashboards/ver_5.4 +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configuration`_. + +.. _`grafana configuration`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.7/_sources/install/monitoring-stack.rst.txt b/branch-4.7/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..5843f351a --- /dev/null +++ b/branch-4.7/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,412 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                                `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.6 + - 2.48.1 + - 10.2.2 + * - 4.5 + - 2.47.1 + - 10.1.5 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.7/_sources/install/start-all.rst.txt b/branch-4.7/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..f270d092f --- /dev/null +++ b/branch-4.7/_sources/install/start-all.rst.txt @@ -0,0 +1,107 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +**--compose** This is an experimental option. When set, it initiates a two-stage process. Firstly, a ``docker-compose.yml`` file is created along with an ``.env`` file. Following this, the script executes ``docker-compose up``. Please note that having docker-compose is a prerequisite. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.7/_sources/install/thanos.rst.txt b/branch-4.7/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.7/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.7/_sources/intro.rst.txt b/branch-4.7/_sources/intro.rst.txt new file mode 100644 index 000000000..78481f6c3 --- /dev/null +++ b/branch-4.7/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.7/_sources/procedures/alerts/alerting.rst.txt b/branch-4.7/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..d196123bc --- /dev/null +++ b/branch-4.7/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,114 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in files placed under `prometheus/prom_rules/`. Prometheus will load any file that ends with `yml` or `yaml`. + +Each Prometheus alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "error" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **error**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alerts severity +--------------- + +Prometheus uses the following severities from low to high: **info**, **warn**, **error**, **critical**. + +The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the **error** alert for disk-full is firing, it silences the **warn** alert. + +When adding your own alerts, you can use the severities to signal the action's importance, for example **critical** would be a pager-duty, while an **error** will be an email. + +Adding Alerts +---------------- + +Add your own alerts in a separate file with a **yml** or **yaml** extension. Making it easier during upgrade. + +Modifying Alerts +---------------- + +It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.7/_sources/procedures/alerts/index.rst.txt b/branch-4.7/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.7/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.7/_sources/procedures/datadog/cloud-integration.rst.txt b/branch-4.7/_sources/procedures/datadog/cloud-integration.rst.txt new file mode 100644 index 000000000..320b0e847 --- /dev/null +++ b/branch-4.7/_sources/procedures/datadog/cloud-integration.rst.txt @@ -0,0 +1,58 @@ +============================================= +ScyllaDB Cloud Monitoring Datadog Integration +============================================= + +To allow external server scrapping, you will need to enable the `Prometheus proxy `_. +The Datadog agent reads from the proxy, which reads from the Promethues server. + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading ScyllaDB dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +ScyllaDB Monitoring Datadog Integration Overview +================================================ +A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog. + +Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those. + +Install And configure the Datadog Agent +======================================= + +Start by installing DataDog Agent on a server with access to ScyllaDB Cloud Prometheus Proxy server, following `Installation `_ guide. +The datadog agent should run on a machine that can reach the Prometheus Proxy server. + +Once the Datadog agent is working, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. ScyllaDB metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.7/_sources/procedures/datadog/index.rst.txt b/branch-4.7/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bb6f4d66 --- /dev/null +++ b/branch-4.7/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,81 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, Check the cloud users `specific guide `_. + +Scylla Monitoring Datadog Integration Overview +============================================== +A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog. + +Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those. +That labeling is done in two places: recording rules and the Prometheus relabel config. + +Recording rules aggregate the metrics so that they will be reported per instance instead of per shard, and they mark the result with a label. + +Prometheus relabel config marks metrics that are reported per instance, like disk and CPU. + + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml +Download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. + +Adding more metrics to Datadog +============================== +To add a missing metric, do the following: + +For ScyllaDB metrics, add a recording rule to report an aggregated per instance of that metric. We suggest placing it in a different YAML file to simplify an upgrade. + +OS-related metrics originate from node_exporter, and Prometheus labels them during scraping. +To label a node exporter metrics, edit the prometheus/prometheus.yml.template search for the job_name: node_exporter and find the metric_relabel_configs. +You can add a metric name to the regex section. + +If you think that metric is helpful for other users, open an issue, and we'll add it. \ No newline at end of file diff --git a/branch-4.7/_sources/procedures/index.rst.txt b/branch-4.7/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..c55898e8b --- /dev/null +++ b/branch-4.7/_sources/procedures/index.rst.txt @@ -0,0 +1,22 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Cloud Users Datadog integration + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Cloud Users Datadog integration ` +* :doc:`Datadog Integration ` +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.7/_sources/procedures/updating-dashboard.rst.txt b/branch-4.7/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..5f6cd7075 --- /dev/null +++ b/branch-4.7/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,300 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 3 +pyyaml + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.7/_sources/reference/index.rst.txt b/branch-4.7/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/branch-4.7/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.7/_sources/reference/matrix.rst.txt b/branch-4.7/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..2a934441d --- /dev/null +++ b/branch-4.7/_sources/reference/matrix.rst.txt @@ -0,0 +1,165 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.7 + - 5.2, 5.4, 6.0 + - 2022.1, 2022.2, 2023.1, 2024.1 + - 1.7.0 + - 3.2 + * - 4.6 + - 5.2, 5.4 + - 2021.1, 2022.1, 2022.2, 2023.1, 2024.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.7/_sources/reference/monitoring-apis.rst.txt b/branch-4.7/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/branch-4.7/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.7/_sources/troubleshooting/index.rst.txt b/branch-4.7/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..fa1b25a10 --- /dev/null +++ b/branch-4.7/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,16 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* You can ask questions and discuss the ScyllaDB Monitoring Stack in the `ScyllaDB community forum `_ and on the `Slack channel `_. \ No newline at end of file diff --git a/branch-4.7/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/branch-4.7/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/branch-4.7/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.7/_sources/upgrade/index.rst.txt b/branch-4.7/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/branch-4.7/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                                +
                                +
                                +
                                Upgrade Scylla Open Source
                                +
                                +
                                + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                                +
                                +
                                diff --git a/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..95cec1d4e --- /dev/null +++ b/branch-4.7/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,150 @@ +====================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b +====================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y.b (The new version) +------------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip + unzip scylla-monitoring-4.y.b.zip + cd scylla-monitoring-scylla-monitoring-4.y.b/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the target files ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the port numbers +^^^^^^^^^^^^^^^^^^^^^^^^^ +ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent. + +Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target. + +.. caution:: + + As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics. + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x.a version that is currently running. + +Killing the new 4.y.b Monitoring stack in testing mode +------------------------------------------------------ + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y.b version while testing. + +Move to version 4.y.b (the new version) +--------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y.b Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x.a version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y.b in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y.b` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x.a +------------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y.b Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x.a/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.7/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.7/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..f86568a31 --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,11 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.7/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.7/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.7/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.7/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.7/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.7/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..06fc98c5f --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,37 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.7/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.7/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.7/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.7/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.7/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.7/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.7/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..ac0b7d62f --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Queues are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.7/_sources/use-monitoring/cql-optimization.rst.txt b/branch-4.7/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..7ac8b2284 --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,155 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +We strongly recommend using use the correct ordering. +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is supported, but not advisable. + + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.7/_sources/use-monitoring/index.rst.txt b/branch-4.7/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/branch-4.7/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.7/_static/basic.css b/branch-4.7/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.7/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.7/_static/check-solid.svg b/branch-4.7/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.7/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.7/_static/clipboard.min.js b/branch-4.7/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.7/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.7/_static/copybutton.css b/branch-4.7/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.7/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                                Short

                                + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.7/_static/copybutton.js b/branch-4.7/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.7/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.7/_static/copybutton_funcs.js b/branch-4.7/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.7/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.7/_static/css/main.css b/branch-4.7/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/branch-4.7/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.7/_static/doctools.js b/branch-4.7/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.7/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.7/_static/documentation_options.js b/branch-4.7/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.7/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.7/_static/file.png b/branch-4.7/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.7/_static/file.png differ diff --git a/branch-4.7/_static/img/banner-background.svg b/branch-4.7/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.7/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.7/_static/img/favicon-228x228.png b/branch-4.7/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.7/_static/img/favicon-228x228.png differ diff --git a/branch-4.7/_static/img/favicon-32x32.png b/branch-4.7/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.7/_static/img/favicon-32x32.png differ diff --git a/branch-4.7/_static/img/favicon.ico b/branch-4.7/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.7/_static/img/favicon.ico differ diff --git a/branch-4.7/_static/img/icons/icon-about-team.svg b/branch-4.7/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.7/_static/img/icons/icon-about-us-m.svg b/branch-4.7/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.7/_static/img/icons/icon-about-us.svg b/branch-4.7/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.7/_static/img/icons/icon-alternator.svg b/branch-4.7/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.7/_static/img/icons/icon-apps.svg b/branch-4.7/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-architecture.svg b/branch-4.7/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.7/_static/img/icons/icon-benchmarks.svg b/branch-4.7/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.7/_static/img/icons/icon-blog.svg b/branch-4.7/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.7/_static/img/icons/icon-careers.svg b/branch-4.7/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.7/_static/img/icons/icon-chevron-left.svg b/branch-4.7/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.7/_static/img/icons/icon-chevron-right.svg b/branch-4.7/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.7/_static/img/icons/icon-circe.svg b/branch-4.7/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-clock.svg b/branch-4.7/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-close.svg b/branch-4.7/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.7/_static/img/icons/icon-cloud-docs.svg b/branch-4.7/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-cloud.svg b/branch-4.7/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.7/_static/img/icons/icon-comparison.svg b/branch-4.7/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.7/_static/img/icons/icon-contact-us.svg b/branch-4.7/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.7/_static/img/icons/icon-developers-blog.svg b/branch-4.7/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.7/_static/img/icons/icon-docs.svg b/branch-4.7/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.7/_static/img/icons/icon-enterprise-m.svg b/branch-4.7/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.7/_static/img/icons/icon-enterprise.svg b/branch-4.7/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.7/_static/img/icons/icon-events.svg b/branch-4.7/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.7/_static/img/icons/icon-exclamation.svg b/branch-4.7/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.7/_static/img/icons/icon-expand.svg b/branch-4.7/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.7/_static/img/icons/icon-forum.svg b/branch-4.7/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-getting-started.svg b/branch-4.7/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-glossary.svg b/branch-4.7/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-home.svg b/branch-4.7/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-infoworld.svg b/branch-4.7/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.7/_static/img/icons/icon-integrations.svg b/branch-4.7/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-knowledge-base.svg b/branch-4.7/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-less.svg b/branch-4.7/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.7/_static/img/icons/icon-live-test.svg b/branch-4.7/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.7/_static/img/icons/icon-mail-list.svg b/branch-4.7/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-manager.svg b/branch-4.7/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.7/_static/img/icons/icon-memory-management.svg b/branch-4.7/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.7/_static/img/icons/icon-modeling.svg b/branch-4.7/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-monitoring.svg b/branch-4.7/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.7/_static/img/icons/icon-networking.svg b/branch-4.7/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.7/_static/img/icons/icon-news.svg b/branch-4.7/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.7/_static/img/icons/icon-newsletter.svg b/branch-4.7/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.7/_static/img/icons/icon-nsql-guides.svg b/branch-4.7/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.7/_static/img/icons/icon-open-source.svg b/branch-4.7/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.7/_static/img/icons/icon-operator.svg b/branch-4.7/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.7/_static/img/icons/icon-overview.svg b/branch-4.7/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.7/_static/img/icons/icon-partners.svg b/branch-4.7/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.7/_static/img/icons/icon-plus.svg b/branch-4.7/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.7/_static/img/icons/icon-pricing.svg b/branch-4.7/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.7/_static/img/icons/icon-release-notes.svg b/branch-4.7/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.7/_static/img/icons/icon-resource-center.svg b/branch-4.7/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.7/_static/img/icons/icon-roadmap.svg b/branch-4.7/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.7/_static/img/icons/icon-search.svg b/branch-4.7/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.7/_static/img/icons/icon-slack.svg b/branch-4.7/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-stack-overflow.svg b/branch-4.7/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.7/_static/img/icons/icon-summit.svg b/branch-4.7/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/icons/icon-support.svg b/branch-4.7/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.7/_static/img/icons/icon-tech-talks.svg b/branch-4.7/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.7/_static/img/icons/icon-testing.svg b/branch-4.7/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.7/_static/img/icons/icon-thumbs-down.svg b/branch-4.7/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.7/_static/img/icons/icon-thumbs-up.svg b/branch-4.7/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.7/_static/img/icons/icon-tip.svg b/branch-4.7/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.7/_static/img/icons/icon-training.svg b/branch-4.7/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.7/_static/img/icons/icon-triangle-down.svg b/branch-4.7/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.7/_static/img/icons/icon-university.svg b/branch-4.7/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.7/_static/img/icons/icon-users-blog.svg b/branch-4.7/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.7/_static/img/icons/icon-warning.svg b/branch-4.7/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.7/_static/img/icons/icon-webinars.svg b/branch-4.7/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.7/_static/img/icons/icon-whitepapers.svg b/branch-4.7/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.7/_static/img/icons/icon-workshop.svg b/branch-4.7/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.7/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.7/_static/img/logo-docs.svg b/branch-4.7/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.7/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.7/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.7/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.7/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.7/_static/img/mascots/404.jpg b/branch-4.7/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.7/_static/img/mascots/404.jpg differ diff --git a/branch-4.7/_static/img/mascots/scylla-3monsters.png b/branch-4.7/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.7/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-alternator.svg b/branch-4.7/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.7/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.7/_static/img/mascots/scylla-cloud.svg b/branch-4.7/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.7/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.7/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.7/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-computer-headset.png b/branch-4.7/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-cup-number-one.png b/branch-4.7/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-docs.svg b/branch-4.7/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.7/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.7/_static/img/mascots/scylla-drivers.svg b/branch-4.7/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.7/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.7/_static/img/mascots/scylla-enterprise.svg b/branch-4.7/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.7/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.7/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.7/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-forklift-migration.png b/branch-4.7/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-gear.png b/branch-4.7/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-hardhat.png b/branch-4.7/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-headband.png b/branch-4.7/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-headset.png b/branch-4.7/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-hearts.png b/branch-4.7/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-looking-down.png b/branch-4.7/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-looking-up.png b/branch-4.7/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.7/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.7/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-manager.svg b/branch-4.7/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.7/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.7/_static/img/mascots/scylla-monitor.svg b/branch-4.7/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.7/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.7/_static/img/mascots/scylla-movement-fast.png b/branch-4.7/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-movement.png b/branch-4.7/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-onpremise.png b/branch-4.7/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-opensource.svg b/branch-4.7/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.7/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.7/_static/img/mascots/scylla-operator.svg b/branch-4.7/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.7/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.7/_static/img/mascots/scylla-plugin.png b/branch-4.7/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-release-mascot.png b/branch-4.7/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-repair.png b/branch-4.7/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-server.png b/branch-4.7/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-sleeping.png b/branch-4.7/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-tall-measure.png b/branch-4.7/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-university.png b/branch-4.7/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-weights.png b/branch-4.7/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-window-cleaning.png b/branch-4.7/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-with-computer-2.png b/branch-4.7/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-with-computer.png b/branch-4.7/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-with-linux.png b/branch-4.7/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.7/_static/img/mascots/scylla-writting.png b/branch-4.7/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.7/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.7/_static/img/menu.svg b/branch-4.7/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.7/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.7/_static/img/scylla-monitor.png b/branch-4.7/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.7/_static/img/scylla-monitor.png differ diff --git a/branch-4.7/_static/js/main.bundle.js b/branch-4.7/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/branch-4.7/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
                              • Back
                              • ',backButtonPosition:"top",wrapper:"
                                ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                                  "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                                  ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                                  ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                                  ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                                  ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                                  "],col:[2,"","
                                  "],tr:[2,"","
                                  "],td:[3,"","
                                  "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +

                                  ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                  + + +
                                  + + + + + +
                                  + + +
                                  + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/genindex.html b/branch-4.7/genindex.html new file mode 100644 index 000000000..88f66ce70 --- /dev/null +++ b/branch-4.7/genindex.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + + + +
                                  + + + + + +
                                  + + +
                                  + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/index.html b/branch-4.7/index.html new file mode 100644 index 000000000..be3f8d3fc --- /dev/null +++ b/branch-4.7/index.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  ScyllaDB Monitoring Stack

                                  +
                                  +
                                  +

                                  ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                  +_images/monitor.png +

                                  The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                                  +
                                    +
                                  • prometheus - collects and stores metrics

                                  • +
                                  • alertmanager - handles alerts

                                  • +
                                  • grafana - dashboard server

                                  • +
                                  +

                                  Choose a topic to get started:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/install/docker-compose.html b/branch-4.7/install/docker-compose.html new file mode 100644 index 000000000..313a289c4 --- /dev/null +++ b/branch-4.7/install/docker-compose.html @@ -0,0 +1,823 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Using Docker Compose

                                  +

                                  Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                                  +

                                  Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                                  +
                                  +

                                  Warning

                                  +

                                  docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                                  +
                                  +
                                  +

                                  Prerequisite

                                  +

                                  Make sure you have docker and docker-compose installed.

                                  +
                                  +
                                  +

                                  Setting Prometheus

                                  +

                                  The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                                  +

                                  You can use ./prometheus-config.sh to generate the file, for example:

                                  +
                                  ./prometheus-config.sh --compose
                                  +
                                  +
                                  +

                                  For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                                  +
                                  +
                                  +

                                  Setting Grafana Provisioning

                                  +

                                  Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                                  +
                                  +

                                  Grafana Data-Source file

                                  +

                                  Run the following command to update the datasource:

                                  +
                                  ./grafana-datasource.sh --compose
                                  +
                                  +
                                  +

                                  You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                                  +
                                  +
                                  +

                                  Grafana Dashboard Load file

                                  +

                                  To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                                  +
                                  ./generate-dashboards.sh -t -v 2020.1
                                  +
                                  +
                                  +

                                  This command generates the files under: grafana/provisioning/dashboards/

                                  +
                                  +
                                  +
                                  +

                                  Docker Compose file

                                  +

                                  You can use the following example as a base for your docker compose.

                                  +

                                  Pass the following to a file called docker-compose.yml

                                  +
                                  services:
                                  +  alertmanager:
                                  +    container_name: aalert
                                  +    image: prom/alertmanager:v0.26.0
                                  +    ports:
                                  +    - 9093:9093
                                  +    volumes:
                                  +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                                  +  grafana:
                                  +    container_name: agraf
                                  +    environment:
                                  +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                                  +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                                  +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                                  +    # This is where you set Grafana security
                                  +    - GF_AUTH_BASIC_ENABLED=false
                                  +    - GF_AUTH_ANONYMOUS_ENABLED=true
                                  +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                                  +    - GF_SECURITY_ADMIN_PASSWORD=admin
                                  +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                                  +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                                  +    image: grafana/grafana:10.4.1
                                  +    ports:
                                  +    - 3000:3000
                                  +    user: 1000:1000
                                  +    volumes:
                                  +    - ./grafana/build:/var/lib/grafana/dashboards
                                  +    - ./grafana/plugins:/var/lib/grafana/plugins
                                  +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                                  +    # Uncomment the following line for grafana persistency
                                  +    # - path/to/grafana/dir:/var/lib/grafana
                                  +  loki:
                                  +    command:
                                  +    - --config.file=/mnt/config/loki-config.yaml
                                  +    container_name: loki
                                  +    image: grafana/loki:2.9.5
                                  +    ports:
                                  +    - 3100:3100
                                  +    volumes:
                                  +    - ./loki/rules:/etc/loki/rules
                                  +    - ./loki/conf:/mnt/config
                                  +  promotheus:
                                  +    command:
                                  +    - --config.file=/etc/prometheus/prometheus.yml
                                  +    container_name: aprom
                                  +    image: prom/prometheus:v2.51.1
                                  +    ports:
                                  +    - 9090:9090
                                  +    volumes:
                                  +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                                  +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                                  +    # instead of the following three targets, you can place three files under one directory and mount that directory
                                  +    # If you do, uncomment the following line and delete the three lines afterwards
                                  +    #- /path/to/targets:/etc/scylla.d/prometheus/targets/
                                  +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/targets/scylla_servers.yml
                                  +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/targets/scylla_manager_servers.yml
                                  +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/targets/node_exporter_servers.yml
                                  +    
                                  +    # Uncomment the following line for prometheus persistency 
                                  +    # - path/to/data/dir:/prometheus/data
                                  +  promtail:
                                  +    command:
                                  +    - --config.file=/etc/promtail/config.yml
                                  +    container_name: promtail
                                  +    image: grafana/promtail:2.7.3
                                  +    ports:
                                  +    - 1514:1514
                                  +    - 9080:9080
                                  +    volumes:
                                  +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                                  +version: '3'
                                  +
                                  +
                                  +
                                  +

                                  Start and Stop

                                  +

                                  To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/install/index.html b/branch-4.7/install/index.html new file mode 100644 index 000000000..38e285656 --- /dev/null +++ b/branch-4.7/install/index.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Download and Install Scylla Monitoring Stack

                                  +
                                  +
                                  +

                                  Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                                  +

                                  Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/install/min-prod-hw.html b/branch-4.7/install/min-prod-hw.html new file mode 100644 index 000000000..76c9770b5 --- /dev/null +++ b/branch-4.7/install/min-prod-hw.html @@ -0,0 +1,746 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Minimal Production System Recommendations

                                  +
                                    +
                                  • CPU - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs

                                  • +
                                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                                  • +
                                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                  • +
                                  • Network - 1GbE/10GbE preferred

                                  • +
                                  +
                                  +

                                  Calculating Prometheus Minimal Disk Space requirement

                                  +

                                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                  +

                                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                  +

                                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                  +
                                  6 * 16 * 15 * 12MB ~ 16GB
                                  +
                                  +
                                  +

                                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                  +
                                  +
                                  +

                                  Calculating Prometheus Minimal Memory Space requirement

                                  +

                                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                  +

                                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                  + +
                                  + +++++++ + + + +
                                  # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                  00
                                  + +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/install/monitor-without-docker.html b/branch-4.7/install/monitor-without-docker.html new file mode 100644 index 000000000..25b115c44 --- /dev/null +++ b/branch-4.7/install/monitor-without-docker.html @@ -0,0 +1,1168 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Deploying Scylla Monitoring Stack Without Docker

                                  +
                                  +

                                  Introduction

                                  +

                                  The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                                  +

                                  Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                                  +

                                  Scylla Monitoring uses the following components:

                                  +
                                    +
                                  • Alertmanager

                                  • +
                                  • Grafana Loki

                                  • +
                                  • Prometheus

                                  • +
                                  • Grafana

                                  • +
                                  +

                                  The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components.

                                  +

                                  We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                                  +
                                  +
                                  +

                                  Minimal Production System Recommendations

                                  +
                                    +
                                  • CPU - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs

                                  • +
                                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                                  • +
                                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                  • +
                                  • Network - 1GbE/10GbE preferred

                                  • +
                                  +
                                  +

                                  Calculating Prometheus Minimal Disk Space requirement

                                  +

                                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                  +

                                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                  +

                                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                  +
                                  6 * 16 * 15 * 12MB ~ 16GB
                                  +
                                  +
                                  +

                                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                  +
                                  +
                                  +

                                  Calculating Prometheus Minimal Memory Space requirement

                                  +

                                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                  +

                                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                  + +
                                  + +++++++ + + + +
                                  # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                  00
                                  + +
                                  +

                                  The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                                  +
                                  +

                                  Note

                                  +

                                  Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Install Scylla Monitoring Stack

                                  +

                                  The following procedure uses a CentOS 7 based instance

                                  +
                                    +
                                  1. Download the latest Scylla Monitoring Stack release.

                                  2. +
                                  +
                                  wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.7.2.tar.gz
                                  +
                                  +
                                  +
                                    +
                                  1. Open the tar

                                  2. +
                                  +

                                  tar -xvf scylla-monitoring-*.tar.gz

                                  +
                                  +
                                  +

                                  Install Alertmanager

                                  +

                                  Tested with alertmanager 0.26.0 version

                                  +
                                    +
                                  1. Install alertmanager

                                  2. +
                                  +
                                  wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
                                  +tar -xvf alertmanager-*.linux-amd64.tar.gz
                                  +
                                  +
                                  +
                                    +
                                  1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                                  2. +
                                  +

                                  For example:

                                  +
                                  cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.7.2/prometheus/rule_config.yml alertmanager-0.26.0.linux-amd64/alertmanager.yml
                                  +
                                  +
                                  +
                                    +
                                  1. Start the Alertmanager

                                  2. +
                                  +

                                  For example:

                                  +
                                  cd alertmanager-0.26.0.linux-amd64/
                                  +./alertmanager
                                  +
                                  +
                                  +
                                    +
                                  1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                                  2. +
                                  +

                                  For example:

                                  +
                                  http://192.168.135.166:9093/
                                  +
                                  +
                                  +../_images/alertmanager.png +
                                  +
                                  +

                                  Install Grafana Loki

                                  +

                                  Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                                  +

                                  We recomand using Loki with containers, but you can install it locally as described in Loki installation

                                  +

                                  You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                                  +

                                  Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                                  +

                                  Loki Related files

                                  +

                                  Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                                  +
                                  mkdir -p /etc/loki/rules
                                  +mkdir -p /etc/loki/config
                                  +cp loki/rules/* /etc/loki/rules
                                  +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                                  +
                                  +
                                  +

                                  Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                                  +

                                  Promtail Related files

                                  +

                                  Promtail has a configuration file. You need to copy and modify the configuration.

                                  +
                                  mkdir -p /etc/promtail/
                                  +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                                  +
                                  +
                                  +

                                  Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                                  +
                                  +
                                  +

                                  Install Prometheus

                                  +

                                  Tested with Prometheus version 2.49.1

                                  +
                                  +

                                  Note

                                  +

                                  If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                                  +
                                  +
                                    +
                                  1. Install Prometheus

                                  2. +
                                  +
                                  wget https://github.com/prometheus/prometheus/releases/download/v2.49.1/prometheus-2.49.1.linux-amd64.tar.gz
                                  +tar -xvf prometheus-*.linux-amd64.tar.gz
                                  +
                                  +
                                  +
                                    +
                                  1. Create Data and Config directories

                                  2. +
                                  +
                                  sudo mkdir -p /prometheus/data
                                  +sudo mkdir -p /etc/prometheus/prom_rules/
                                  +sudo mkdir -p /etc/scylla.d/prometheus/
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  To run Promethues as non-root user, you would need to give read write and execute permissions to those directories.

                                  +
                                  +
                                    +
                                  1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                                  2. +
                                  +

                                  Copy prometheus/prometheus.yml.template to prometheus.yml

                                  +

                                  For example:

                                  +
                                  cp scylla-monitoring-scylla-monitoring-4.7.2/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                                  +cp scylla-monitoring-scylla-monitoring-4.7.2/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                                  +
                                  +
                                  +
                                    +
                                  1. Edit the prometheus.yml file to point to the correct static data sources.

                                  2. +
                                  +
                                  +

                                  Note

                                  +

                                  Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                                  +
                                  +
                                  vi /etc/prometheus/prometheus.yml
                                  +
                                  +
                                  +

                                  Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                                  +

                                  For example if the alertmanager will run on the same host:

                                  +
                                  alerting:
                                  +   alertmanagers:
                                  +   - static_configs:
                                  +       - targets:
                                  +           - 127.0.0.1:9093
                                  +
                                  +
                                  +

                                  Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                                  +

                                  For example the scrape config for Scylla:

                                  +
                                  global:
                                  +  scrape_interval: 5s # By default, scrape targets every 5 second.
                                  +  scrape_timeout: 4s # Timeout before trying to scape a target again
                                  +
                                  +  # Attach these labels to any time series or alerts when communicating with
                                  +  # external systems (federation, remote storage, Alertmanager).
                                  +  external_labels:
                                  +    monitor: 'scylla-monitor'
                                  +
                                  +scrape_configs:
                                  +- job_name: scylla
                                  +  honor_labels: false
                                  +  file_sd_configs:
                                  +    - files:
                                  +      - /etc/scylla.d/prometheus/scylla_servers.yml
                                  +  relabel_configs:
                                  +    - source_labels: [__address__]
                                  +      regex:  '([^:]+)'
                                  +      target_label: __address__
                                  +      replacement: '${1}:9180'
                                  +
                                  +    - source_labels: [__address__]
                                  +      regex:  '(.*):.+'
                                  +      target_label: instance
                                  +      replacement: '${1}'
                                  +
                                  +
                                  +
                                    +
                                  1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                                  2. +
                                  +
                                  +

                                  Note

                                  +

                                  There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                                  +
                                  +

                                  An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                                  +
                                  +

                                  Note

                                  +

                                  You must have both files even if you are not using Scylla Manager

                                  +
                                  +

                                  Add the labels for the cluster and data-center

                                  +

                                  scylla_servers.yml:

                                  +

                                  For example:

                                  +
                                  cat /etc/scylla.d/prometheus/scylla_servers.yml
                                  +# List Scylla end points
                                  +
                                  +- targets:
                                  +  - 192.168.66.6
                                  +  - 192.168.66.244
                                  +  labels:
                                  +    cluster: cluster1
                                  +    dc: dc1
                                  +- targets:
                                  +    - 172.17.0.3
                                  +  labels:
                                  +    cluster: cluster1
                                  +    dc: dc2
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  See the previous note about deprecating the node_exporter_servers.yml file.

                                  +
                                  +

                                  scylla_manager_server.yml

                                  +

                                  For example:

                                  +
                                  cat /etc/scylla.d/prometheus/scylla_manager_server.yml
                                  +- targets:
                                  +  - 127.0.0.1:5090
                                  +
                                  +
                                  +
                                    +
                                  1. Start Prometheus server:

                                  2. +
                                  +

                                  For example:

                                  +
                                  cd cd prometheus-2.49.1.linux-amd64/
                                  +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                                  +
                                  +
                                  +

                                  Data should start accumulate on: /prometheus/data

                                  +
                                    +
                                  1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                                  2. +
                                  +

                                  For example:

                                  +
                                  http://192.168.135.166:9090/
                                  +
                                  +
                                  +../_images/1.png +

                                  Prometheus console should be visible

                                  +
                                    +
                                  1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                                  2. +
                                  +

                                  For example:

                                  +

                                  node_memory_MemFree

                                  +../_images/2.png +

                                  And

                                  +

                                  scylla_reactor_utilization

                                  +../_images/3.png +

                                  At this point Scylla is emitting the metrics and Prometheus is able to store them.

                                  +
                                  +
                                  +

                                  Install Grafana

                                  +

                                  Tested with Grafna 10.3.3

                                  +
                                    +
                                  1. Install Grafana based on the instructions here

                                  2. +
                                  +

                                  Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different, we will assume that you used yum/dnf install.

                                  +
                                    +
                                  1. Access Scylla-Grafana-monitoring directory

                                  2. +
                                  +
                                  cd scylla-monitoring-scylla-monitoring-4.7.2/
                                  +
                                  +
                                  +
                                    +
                                  1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                                  2. +
                                  +
                                  sudo cp -r grafana/plugins /var/lib/grafana/
                                  +
                                  +
                                  +
                                    +
                                  1. Provision the Dashboards

                                  2. +
                                  +

                                  For example Scylla Open-source version 5.4 and Scylla manager version 2.4

                                  +
                                  sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.5.4.yaml
                                  +sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml
                                  +sudo mkdir -p /var/lib/grafana/dashboards
                                  +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                                  +
                                  +
                                  +

                                  Edit the load.* you just copied. For example

                                  +
                                  $ cat /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml
                                  +apiVersion: 1
                                  +
                                  +providers:
                                  +- name: 'manager_3.3'
                                  +  orgId: 1
                                  +  folder: ''
                                  +  type: file
                                  +  disableDeletion: false
                                  +  allowUiUpdates: true
                                  +  updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards
                                  +  options:
                                  +    path: /var/lib/grafana/dashboards/manager_3.3
                                  +
                                  +$ cat /etc/grafana/provisioning/dashboards/load.5.4.yaml
                                  +apiVersion: 1
                                  +
                                  +providers:
                                  +- name: '5.4'
                                  +  orgId: 1
                                  +  folder: ''
                                  +  type: file
                                  +  disableDeletion: false
                                  +  allowUiUpdates: true
                                  +  updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards
                                  +  options:
                                  +    path: /var/lib/grafana/dashboards/ver_5.4
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                                  +
                                  +
                                    +
                                  1. Set the data source by copy datasource.yml and edit it

                                  2. +
                                  +
                                  sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  Scylla uses a plugin to read from some system tables see the section below about using it.

                                  +
                                  +

                                  You should set the Prometheus and the alertmanager IP and port.

                                  +

                                  For example

                                  +
                                  sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                                  +apiVersion: 1
                                  +datasources:
                                  + - name: prometheus
                                  +   type: prometheus
                                  +   url: http://192.168.135.167:9090
                                  +   access: proxy
                                  +   basicAuth: false
                                  +
                                  + - name: alertmanager
                                  +   type: camptocamp-prometheus-alertmanager-datasource
                                  +   orgId: 1
                                  +   typeLogoUrl: public/img/icn-datasource.svg
                                  +   access: proxy
                                  +   url: http://192.168.135.166:9093
                                  +   password:
                                  +   user:
                                  +   database:
                                  +   basicAuth:
                                  +   isDefault:
                                  +   jsonData:
                                  +     severity_critical: '4'
                                  +     severity_high: '3'
                                  +     severity_warning: '2'
                                  +     severity_info: '1'
                                  +
                                  +
                                  +
                                    +
                                  1. Start the Grafana service

                                  2. +
                                  +

                                  For Grafana installed with yum install

                                  +

                                  sudo service grafana-server start

                                  +
                                    +
                                  1. Make sure Grafana is running

                                  2. +
                                  +

                                  Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                                  +../_images/grafana.png +
                                  +
                                  +

                                  Using Scylla Plugin with Grafana

                                  +

                                  Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                                  +

                                  Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                                  +
                                  +

                                  Setting a monitoring user

                                  +

                                  This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                                  +
                                    +
                                  • If you have not done so, enable authorization first.

                                  • +
                                  • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                                  • +
                                  • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                                  • +
                                  +
                                  +
                                  +

                                  Installing the Plugin

                                  +

                                  Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                                  +
                                  +
                                  +

                                  Configure the Plugin

                                  +

                                  Add an entry to the datasource.yml file

                                  +
                                  - name: scylla-datasource
                                  +  type: scylladb-scylla-datasource
                                  +  orgId: 1
                                  +  isDefault:
                                  +  jsonData:
                                  +  host: ''
                                  +#  secureJsonData:
                                  +#    user: 'scylla_monitoring'
                                  +#    password: 'scylla_monitoring'
                                  +
                                  +
                                  +

                                  As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                                  +
                                  +
                                  +

                                  Enable the Plugin

                                  +

                                  Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                                  +

                                  See more about it the Grafana configuration.

                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/install/monitoring-stack.html b/branch-4.7/install/monitoring-stack.html new file mode 100644 index 000000000..872eac51b --- /dev/null +++ b/branch-4.7/install/monitoring-stack.html @@ -0,0 +1,1109 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Install Scylla Monitoring Stack

                                  +

                                  This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                                  +

                                  The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                                  +

                                  For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                                  +
                                  +

                                  Minimal Production System Recommendations

                                  +
                                    +
                                  • CPU - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs

                                  • +
                                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                                  • +
                                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                  • +
                                  • Network - 1GbE/10GbE preferred

                                  • +
                                  +
                                  +

                                  Calculating Prometheus Minimal Disk Space requirement

                                  +

                                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                  +

                                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                  +

                                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                  +
                                  6 * 16 * 15 * 12MB ~ 16GB
                                  +
                                  +
                                  +

                                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                  +
                                  +
                                  +

                                  Calculating Prometheus Minimal Memory Space requirement

                                  +

                                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                  +

                                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                  + +
                                  + +++++++ + + + +
                                  # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                  00
                                  + +
                                  +
                                  +
                                  +
                                  +

                                  Prerequisites

                                  +
                                    +
                                  • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                                  • +
                                  • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                                  • +
                                  + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  Scylla Monitoring Stack Compatibility Matrix

                                  Scylla Monitoring Stack Version

                                  Prometheus Version

                                  Grafana Version

                                  4.6

                                  2.48.1

                                  10.2.2

                                  4.5

                                  2.47.1

                                  10.1.5

                                  4.4

                                  2.44.0

                                  9.5.2

                                  4.3

                                  2.42.0

                                  9.3.8

                                  4.2

                                  2.41.0

                                  9.3.4

                                  4.1

                                  2.38.0

                                  9.1.0

                                  4.0

                                  2.34.0

                                  8.5.2

                                  3.11

                                  2.32.0

                                  8.3.4

                                  3.10

                                  2.32.0

                                  8.3.3

                                  3.9.2

                                  2.29.1

                                  8.2.7

                                  3.9

                                  2.29.1

                                  8.1.1

                                  3.8

                                  2.27.1

                                  7.5.7

                                  3.7

                                  2.25.2

                                  7.4.0

                                  3.6

                                  2.18.1

                                  7.3.5

                                  3.5

                                  2.18.1

                                  7.1.5

                                  3.4

                                  2.18.1

                                  6.7.3

                                  +
                                  +
                                  +

                                  Docker Post Installation

                                  +

                                  Docker post installation guide can be found here

                                  +
                                  +

                                  Note

                                  +

                                  Avoid running the container as root.

                                  +
                                  +

                                  To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                                  +
                                    +
                                  1. Create the Docker group.

                                  2. +
                                  +
                                  sudo groupadd docker
                                  +
                                  +
                                  +
                                    +
                                  1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                                  2. +
                                  +
                                  sudo usermod -aG docker $USER
                                  +
                                  +
                                  +
                                    +
                                  1. Start Docker by calling:

                                  2. +
                                  +
                                  sudo systemctl enable docker
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Install Scylla Monitoring Stack

                                  +

                                  Procedure

                                  +
                                    +
                                  1. Download and extract the latest Scylla Monitoring Stack binary;.

                                  2. +
                                  +
                                  wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.7.2.tar.gz
                                  +tar -xvf scylla-monitoring-4.7.2.tar.gz
                                  +cd scylla-monitoring-scylla-monitoring-4.7.2
                                  +
                                  +
                                  +

                                  As an alternative, you can clone and use the Git repository directly.

                                  +
                                  git clone https://github.com/scylladb/scylla-monitoring.git
                                  +cd scylla-monitoring
                                  +git checkout branch-4.7
                                  +
                                  +
                                  +
                                    +
                                  1. Start Docker service if needed

                                  2. +
                                  +
                                  sudo systemctl restart docker
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Configure Scylla Monitoring Stack

                                  +

                                  To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                                  +

                                  This configuration can be done from files, or using the Consul api.

                                  +

                                  Scylla Manager 2.0 and higher supports the Consul API.

                                  +
                                  +

                                  Configure Scylla nodes from files

                                  +
                                    +
                                  1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                                  2. +
                                  +
                                  +

                                  Note

                                  +

                                  It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                                  +
                                  +

                                  For example:

                                  +
                                  - targets:
                                  +      - 172.17.0.2
                                  +      - 172.17.0.3
                                  +  labels:
                                  +      cluster: cluster1
                                  +      dc: dc1
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                                  +
                                  +

                                  Using IPV6

                                  +

                                  To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets.

                                  +

                                  For example:

                                  +
                                  - targets:
                                  +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]"
                                  +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]"
                                  +  labels:
                                  +      cluster: cluster1
                                  +      dc: dc1
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                                  +
                                  +

                                  For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                                  +
                                  +

                                  Note

                                  +

                                  By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                                  +
                                  +

                                  If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                                  +

                                  For example:

                                  +
                                  ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                                  +
                                  +
                                  +

                                  Mark the different Data Centers with Labels.

                                  +

                                  As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                                  +

                                  You can use the genconfig.py script to generate the server file. For example:

                                  +
                                  ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                                  +
                                  +
                                  +

                                  This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                                  +

                                  OR

                                  +

                                  The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                                  +
                                  nodetool status | ./genconfig.py -NS
                                  +
                                  +
                                  +

                                  2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                                  +

                                  You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                                  +

                                  For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                                  +
                                  # List Scylla Manager end points
                                  +
                                  +- targets:
                                  +  - 172.17.0.7:5090
                                  +
                                  +
                                  +

                                  Note that you do not need to add labels to the Scylla Manager targets.

                                  +
                                  +
                                  +

                                  Configure Scylla nodes using Scylla-Manager Consul API

                                  +

                                  Scylla Manager 2.0 has a Consul like API.

                                  +

                                  When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                                  +

                                  For example:

                                  +
                                  ./start-all.sh -L 10.10.0.1
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                                  +
                                  +
                                  +
                                  +

                                  Connecting Scylla-Monitoring to ScyllaDB

                                  +

                                  Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                                  +

                                  You can limit the user to read only, currently it only read table from the system keyspace.

                                  +

                                  You can set a user and password from a file or environment variables.

                                  +

                                  If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                                  +

                                  To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                                  +
                                  +

                                  Note

                                  +

                                  It is best to use a dedicated user and password with limited privileges.

                                  +
                                  +
                                  +
                                  +

                                  Use an external directory for the Prometheus data directory

                                  +

                                  The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                                  +
                                  +

                                  Note

                                  +

                                  Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                                  +
                                  +

                                  If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                                  +

                                  In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                                  +
                                  +
                                  +

                                  Add Additional Prometheus Targets

                                  +

                                  There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                                  +

                                  The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                                  +

                                  You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                                  +
                                  - job_name: 'myservice'
                                  +  # Override the global default and scrape targets from this job every 5 seconds.
                                  +  scrape_interval: 5s
                                  +  static_configs:
                                  +    - targets:
                                  +      - 17.0.0.1:7000
                                  +
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Start and Stop Scylla Monitoring Stack

                                  +
                                  +

                                  Start

                                  +
                                  ./start-all.sh -d prometheus_data
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Stop

                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Start a Specific Scylla Monitoring Stack Version

                                  +

                                  By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                                  +

                                  You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                                  +

                                  Multiple versions are supported. For example:

                                  +
                                  ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                                  +
                                  +
                                  +

                                  will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                                  +
                                  +
                                  +

                                  Accessing the localhost

                                  +

                                  The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                                  +
                                  ./start-all.sh -l -d prometheus-data
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Configure rsyslog on each Scylla node

                                  +

                                  generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                                  +

                                  Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                                  +

                                  Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                                  +

                                  If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                                  +
                                  if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                                  +
                                  +
                                  +

                                  Restart rsyslog for the configuration to take effect.

                                  +
                                  systemctl restart rsyslog
                                  +
                                  +
                                  +
                                  +
                                  +
                                  +

                                  View Grafana Dashboards

                                  +

                                  Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/install/start-all.html b/branch-4.7/install/start-all.html new file mode 100644 index 000000000..e594912be --- /dev/null +++ b/branch-4.7/install/start-all.html @@ -0,0 +1,761 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  The start-all.sh Command

                                  +

                                  Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                                  +

                                  The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                                  +
                                  +

                                  General Options

                                  +

                                  -h Help, Print the help, and exit.

                                  +

                                  –version print the current Scylla-Monitoring stack version, and exit.

                                  +

                                  -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                                  +

                                  -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                                  +

                                  -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                                  +

                                  –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                                  +

                                  –compose This is an experimental option. When set, it initiates a two-stage process. Firstly, a docker-compose.yml file is created along with an .env file. Following this, the script executes docker-compose up. Please note that having docker-compose is a prerequisite.

                                  +
                                  + + +
                                  +

                                  Alert Manager

                                  +

                                  The Alertmanager handles the alerts and takes the following parameters:

                                  +

                                  -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                                  +

                                  -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                                  +

                                  -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/install/thanos.html b/branch-4.7/install/thanos.html new file mode 100644 index 000000000..9952415fa --- /dev/null +++ b/branch-4.7/install/thanos.html @@ -0,0 +1,760 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Using Thanos as Data Source With Scylla Monitoring Stack

                                  +

                                  Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                                  +
                                    +
                                  • High-availability.

                                  • +
                                  • Horizontal scaling.

                                  • +
                                  • Backup.

                                  • +
                                  +

                                  The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                                  +

                                  The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                                  +
                                  +

                                  Using Thanos As a Prometheus Aggregator

                                  +

                                  There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                                  +
                                  +

                                  Prometheus Configuration

                                  +

                                  We will assume you have two Prometheus servers running.

                                  +
                                    +
                                  1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                                  2. +
                                  3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                                  4. +
                                  +
                                  +
                                  +

                                  Thanos sidecar

                                  +

                                  The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                                  +
                                  docker run -d \
                                  + -v /path/to/prom/dir:/data/prom:z \
                                  + -i --name sidecar thanosio/thanos \
                                  + sidecar \
                                  + --grpc-address=0.0.0.0:10911 \
                                  + --grpc-grace-period=1s \
                                  + --http-address=0.0.0.0:10912 \
                                  + --http-grace-period=1s \
                                  + --prometheus.url=http://prometheus-ip:9090 \
                                  + --tsdb.path=/data/prom \
                                  + -p 10912:10912 \
                                  + -p 10911:10911
                                  +
                                  +
                                  +

                                  After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                                  +
                                  +
                                  +

                                  Thanos query

                                  +

                                  Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                                  +
                                  docker run -d \
                                  + --name thanos -- thanosio/thanos \
                                  +   query \
                                  +   --debug.name=query0 \
                                  +   --log.level=debug \
                                  +   --grpc-address=0.0.0.0:10903 \
                                  +   --grpc-grace-period=1s \
                                  +   --http-address=0.0.0.0:10904 \
                                  +   --http-grace-period=1s \
                                  +   --query.replica-label=prometheus \
                                  +   --store={ip1}:10911 --store={ip2}:10911
                                  +
                                  +
                                  +

                                  After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                                  +
                                  +
                                  +

                                  Update Scylla Data source

                                  +

                                  The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                                  +

                                  The file you edit is a template file that replaces the file Grafana uses, next time you start.

                                  +

                                  Restart the Scylla Monitoring Stack it should now use Thanos.

                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/intro.html b/branch-4.7/intro.html new file mode 100644 index 000000000..30ae89360 --- /dev/null +++ b/branch-4.7/intro.html @@ -0,0 +1,709 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  ScyllaDB Monitoring Stack

                                  +

                                  ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                  +_images/monitor.png +

                                  The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                                  +
                                    +
                                  • prometheus - Collects and stores metrics

                                  • +
                                  • grafan-loki - Parses logs and generates metrics and alerts

                                  • +
                                  • alertmanager - Handles alerts

                                  • +
                                  • grafana - Dashboards server

                                  • +
                                  +

                                  A few optional components are used for additional services

                                  +
                                    +
                                  • grafana-image-renderer - Allows you to download a dashboard as an image.

                                  • +
                                  • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                                  • +
                                  +
                                  +

                                  High Level Architecture

                                  +_images/monitoring_stack1.png +

                                  We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                                  +

                                  We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                                  +

                                  The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                                  +

                                  We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                                  +

                                  Choose a topic to get started:

                                  + +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/objects.inv b/branch-4.7/objects.inv new file mode 100644 index 000000000..0e3f04744 Binary files /dev/null and b/branch-4.7/objects.inv differ diff --git a/branch-4.7/procedures/alerts/alerting.html b/branch-4.7/procedures/alerts/alerting.html new file mode 100644 index 000000000..0f8bdd54e --- /dev/null +++ b/branch-4.7/procedures/alerts/alerting.html @@ -0,0 +1,778 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Alerting

                                  +

                                  Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                                  +

                                  You can read more about Prometheus alerting here

                                  +

                                  By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                                  +

                                  In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                                  +

                                  The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                                  +../../_images/monitoring_stack.png +
                                  +

                                  Prometheus Alerts

                                  +

                                  The Prometheus alerts are defined in files placed under prometheus/prom_rules/. Prometheus will load any file that ends with yml or yaml.

                                  +

                                  Each Prometheus alert consists of:

                                  +
                                    +
                                  • Name

                                  • +
                                  • What happened

                                  • +
                                  • For how long

                                  • +
                                  • What to report

                                  • +
                                  +

                                  For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                                  +
                                  - alert: InstanceDown
                                  +  expr: up == 0
                                  +  for: 60s
                                  +  labels:
                                  +    severity: "error"
                                  +  annotations:
                                  +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                                  +    summary: Instance {{ $labels.instance }} down
                                  +
                                  +
                                  +

                                  The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                                  +

                                  The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                                  +

                                  The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to error.

                                  +

                                  annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                                  +
                                  +

                                  Alerts severity

                                  +

                                  Prometheus uses the following severities from low to high: info, warn, error, critical.

                                  +

                                  The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the error alert for disk-full is firing, it silences the warn alert.

                                  +

                                  When adding your own alerts, you can use the severities to signal the action’s importance, for example critical would be a pager-duty, while an error will be an email.

                                  +
                                  +
                                  +

                                  Adding Alerts

                                  +

                                  Add your own alerts in a separate file with a yml or yaml extension. Making it easier during upgrade.

                                  +
                                  +
                                  +

                                  Modifying Alerts

                                  +

                                  It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade.

                                  +
                                  +
                                  +
                                  +

                                  Alertmanager

                                  +

                                  The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                                  +

                                  The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                                  +
                                    +
                                  • Routes: Represent a routing tree, the most specific rule, wins

                                  • +
                                  • Inhibition: Mute an alert, based on another alert

                                  • +
                                  • Receiver: Send a notification via email, sluck, etc’

                                  • +
                                  +

                                  Check the Alertmanager documentation for details on how to specify a specific receiver.

                                  +

                                  In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                                  +
                                  +
                                  +

                                  Tips When Adding an Alert

                                  +

                                  It’s worse having an alert that does not work, than not having an alert at all

                                  +

                                  There are multiple ways you can use to make sure your alert is set correctly:

                                  +
                                    +
                                  • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                                  • +
                                  • Force the alert to be active by reducing the limits or the duration.

                                  • +
                                  • When possible simulate the actual scenario and see that the alert works as expected.

                                  • +
                                  +

                                  For example, low available disk space.

                                  +

                                  Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                                  +

                                  Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                                  +

                                  Starting with a simple working expression helps you bisect problems.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/procedures/alerts/index.html b/branch-4.7/procedures/alerts/index.html new file mode 100644 index 000000000..01e35a5d8 --- /dev/null +++ b/branch-4.7/procedures/alerts/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Stack Alert Manager

                                  +
                                  +
                                  +

                                  Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/procedures/datadog/cloud-integration.html b/branch-4.7/procedures/datadog/cloud-integration.html new file mode 100644 index 000000000..541a090c5 --- /dev/null +++ b/branch-4.7/procedures/datadog/cloud-integration.html @@ -0,0 +1,741 @@ + + + + + + + + + + + + + ScyllaDB Cloud Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  ScyllaDB Cloud Monitoring Datadog Integration

                                  +

                                  To allow external server scrapping, you will need to enable the Prometheus proxy. +The Datadog agent reads from the proxy, which reads from the Promethues server.

                                  +
                                    +
                                  1. Installing and configuring the Datadog Agent.

                                  2. +
                                  3. Add Datadog recording rules.

                                  4. +
                                  5. Loading ScyllaDB dashboard to Datadog.

                                  6. +
                                  7. Optionally load Monitor (Alerts).

                                  8. +
                                  +
                                  +

                                  ScyllaDB Monitoring Datadog Integration Overview

                                  +

                                  A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog.

                                  +

                                  Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those.

                                  +
                                  +
                                  +

                                  Install And configure the Datadog Agent

                                  +

                                  Start by installing DataDog Agent on a server with access to ScyllaDB Cloud Prometheus Proxy server, following Installation guide. +The datadog agent should run on a machine that can reach the Prometheus Proxy server.

                                  +

                                  Once the Datadog agent is working, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                  +

                                  Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                                  +
                                  +

                                  Post configuration

                                  +

                                  Restart the agent based on your installation. ScyllaDB metrics should be visible in Datadog.

                                  +
                                  +

                                  Note

                                  +

                                  By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Upload the Dashboard

                                  +

                                  Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                                  +
                                  +
                                  +

                                  Using the Dashboard

                                  +

                                  We created a Datadog dashboard that resembles the Grafana dashboards.

                                  +../../_images/datadog.png +

                                  The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                                  +
                                  +

                                  Note

                                  +

                                  Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                                  +
                                  +
                                  +
                                  +

                                  Adding Monitor

                                  +

                                  Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/procedures/datadog/index.html b/branch-4.7/procedures/datadog/index.html new file mode 100644 index 000000000..92dcbc3d4 --- /dev/null +++ b/branch-4.7/procedures/datadog/index.html @@ -0,0 +1,762 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Datadog Integration

                                  +

                                  The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                                  +
                                    +
                                  1. Installing and configuring the Datadog Agent.

                                  2. +
                                  3. Add Datadog recording rules.

                                  4. +
                                  5. Loading Scylla dashboard to Datadog.

                                  6. +
                                  7. Optionally load Monitor (Alerts).

                                  8. +
                                  +
                                  +

                                  Note

                                  +

                                  Scylla Cloud users, Check the cloud users specific guide.

                                  +
                                  +
                                  +

                                  Scylla Monitoring Datadog Integration Overview

                                  +

                                  A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog.

                                  +

                                  Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those. +That labeling is done in two places: recording rules and the Prometheus relabel config.

                                  +

                                  Recording rules aggregate the metrics so that they will be reported per instance instead of per shard, and they mark the result with a label.

                                  +

                                  Prometheus relabel config marks metrics that are reported per instance, like disk and CPU.

                                  +
                                  +
                                  +

                                  Install And configure the Datadog Agent

                                  +

                                  Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                                  +

                                  Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml +Download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                                  +
                                  +

                                  Post configuration

                                  +

                                  Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                                  +
                                  +

                                  Note

                                  +

                                  By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Add datadog recording rules

                                  +

                                  Download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                                  +
                                  +
                                  +

                                  Upload the Dashboard

                                  +

                                  Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                                  +
                                  +
                                  +

                                  Using the Dashboard

                                  +

                                  We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                                  +../../_images/datadog.png +

                                  The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                                  +
                                  +

                                  Note

                                  +

                                  Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                                  +
                                  +
                                  +
                                  +

                                  Adding Monitor

                                  +

                                  Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                                  +
                                  +
                                  +

                                  Adding more metrics to Datadog

                                  +

                                  To add a missing metric, do the following:

                                  +

                                  For ScyllaDB metrics, add a recording rule to report an aggregated per instance of that metric. We suggest placing it in a different YAML file to simplify an upgrade.

                                  +

                                  OS-related metrics originate from node_exporter, and Prometheus labels them during scraping. +To label a node exporter metrics, edit the prometheus/prometheus.yml.template search for the job_name: node_exporter and find the metric_relabel_configs. +You can add a metric name to the regex section.

                                  +

                                  If you think that metric is helpful for other users, open an issue, and we’ll add it.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/procedures/index.html b/branch-4.7/procedures/index.html new file mode 100644 index 000000000..6ba58d207 --- /dev/null +++ b/branch-4.7/procedures/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  ScyllaDB Monitoring Stack Procedures

                                  +
                                  +
                                  +

                                  There are several reference guides available which give additional information. Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/procedures/updating-dashboard.html b/branch-4.7/procedures/updating-dashboard.html new file mode 100644 index 000000000..ec13a118f --- /dev/null +++ b/branch-4.7/procedures/updating-dashboard.html @@ -0,0 +1,966 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Adding and Modifying Dashboards

                                  +

                                  This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                                  +

                                  It covers dashboard templates and how to modify them.

                                  + +
                                  +

                                  General Limitations

                                  +

                                  Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                                  +
                                  +

                                  Consistency Between Restarts

                                  +

                                  By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                                  +
                                  +
                                  +

                                  Consistency Between Upgrades

                                  +

                                  As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                                  +
                                  +

                                  Note

                                  +

                                   You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                                  +
                                  +

                                  At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                                  +
                                  +
                                  +
                                  +

                                  Using Templated Dashboards

                                  +

                                  Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                                  +

                                  Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                                  +

                                  For example a typical graph panel would look like this:

                                  +
                                  {
                                  +    "aliasColors": {},
                                  +    "bars": false,
                                  +    "datasource": "prometheus",
                                  +    "editable": true,
                                  +    "error": false,
                                  +    "fill": 0,
                                  +    "grid": {
                                  +        "threshold1": null,
                                  +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                                  +        "threshold2": null,
                                  +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                                  +    },
                                  +    "gridPos": {
                                  +        "h": 6,
                                  +        "w": 10,
                                  +        "x": 0,
                                  +        "y": 4
                                  +    },
                                  +    "id": 2,
                                  +    "isNew": true,
                                  +    "legend": {
                                  +        "avg": false,
                                  +        "current": false,
                                  +        "max": false,
                                  +        "min": false,
                                  +        "show": false,
                                  +        "total": false,
                                  +        "values": false
                                  +    },
                                  +    "lines": true,
                                  +    "linewidth": 2,
                                  +    "links": [],
                                  +    "nullPointMode": "connected",
                                  +    "percentage": false,
                                  +    "pointradius": 5,
                                  +    "points": false,
                                  +    "renderer": "flot",
                                  +    "seriesOverrides": [
                                  +        {}
                                  +    ],
                                  +    "span": 5,
                                  +    "stack": false,
                                  +    "steppedLine": false,
                                  +    "targets": [
                                  +        {
                                  +            "expr": "sum(node_filesystem_avail) by (instance)",
                                  +            "intervalFactor": 1,
                                  +            "legendFormat": "",
                                  +            "refId": "A",
                                  +            "step": 1
                                  +        }
                                  +    ],
                                  +    "timeFrom": null,
                                  +    "timeShift": null,
                                  +    "title": "Available Disk Size",
                                  +    "tooltip": {
                                  +        "msResolution": false,
                                  +        "shared": true,
                                  +        "sort": 0,
                                  +        "value_type": "cumulative"
                                  +    },
                                  +    "transparent": false,
                                  +    "type": "graph",
                                  +    "xaxis": {
                                  +        "show": true
                                  +    },
                                  +    "yaxes": [
                                  +        {
                                  +            "format": "percent",
                                  +            "logBase": 1,
                                  +            "max": 101,
                                  +            "min": 0,
                                  +            "show": true
                                  +        },
                                  +        {
                                  +            "format": "short",
                                  +            "logBase": 1,
                                  +            "max": null,
                                  +            "min": null,
                                  +            "show": true
                                  +        }
                                  +    ]
                                  +}
                                  +
                                  +
                                  +

                                  As you can imagine, most panels would have similar values.

                                  +

                                  To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                                  +
                                  +

                                  The Template Class System

                                  +

                                  The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                                  +

                                  The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                                  +

                                  In the template file, you can also add or override attributes.

                                  +

                                  The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                                  +

                                  When generating dashboards, each class will be replaced by its definition.

                                  +

                                  For example, a row in the type.json is defined as:

                                  +
                                  {
                                  + "base_row": {
                                  +     "collapse": false,
                                  +     "editable": true
                                  + },
                                  + "row": {
                                  +     "class": "base_row",
                                  +     "height": "250px"
                                  + }
                                  + }
                                  +
                                  +
                                  +

                                  Will be used like in a template:

                                  +
                                  {
                                  +     "class": "row",
                                  +     "height": "150px",
                                  +     "panels": [
                                  +     ]
                                  +}
                                  +
                                  +
                                  +

                                  And the output will be:

                                  +
                                  {
                                  +     "class": "row",
                                  +     "collapse": false,
                                  +     "editable": true,
                                  +     "height": "150px",
                                  +     "panels": [
                                  +
                                  +     ]
                                  +}
                                  +
                                  +
                                  +

                                  We can see that the template added the panels attribute and that it overrides the height attribute.

                                  +
                                  +
                                  +

                                  Panel Example

                                  +

                                  Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                                  +
                                  {
                                  +     "class": "row",
                                  +     "panels": [
                                  +         {
                                  +             "class": "bytes_panel",
                                  +             "span": 3,
                                  +             "targets": [
                                  +                 {
                                  +                     "expr": "sum(node_filesystem_avail) by (instance)",
                                  +                     "intervalFactor": 1,
                                  +                     "legendFormat": "",
                                  +                     "metric": "",
                                  +                     "refId": "A",
                                  +                     "step": 1
                                  +                 }
                                  +             ],
                                  +             "title": "Available Disk Size"
                                  +         }
                                  +     ]
                                  +}
                                  +
                                  +
                                  +

                                  In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                                  +

                                  You can also see that the span attribute is overridden to set the panel size.

                                  +

                                  To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                                  +
                                  +
                                  +

                                  Grafana Formats and Layouts

                                  +

                                  The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                                  +

                                  Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                                  +

                                  The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                                  +

                                  To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                                  +

                                  The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                                  +

                                  You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                                  +

                                  gridPos has the following attributes:

                                  +
                                  {
                                  +   "x": 0,
                                  +   "y": 0,
                                  +   "w": 24,
                                  +   "h": 4
                                  + }
                                  +
                                  +
                                  +

                                  When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                                  +
                                  {
                                  +   "gridPos": {
                                  +      "h": 2
                                  +    }
                                  +}
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Generating the dashboards from templates (generate-dashboards.sh)

                                  +
                                  +

                                  Prerequisite

                                  +

                                  Python 3 +pyyaml

                                  +

                                  make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                                  +

                                  Use the -h flag to get help information.

                                  +

                                  You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                                  +

                                  When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                                  +

                                  For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                                  +

                                  .\generate-dashboards.sh -v 2020.1

                                  +
                                  +

                                  Note

                                  +

                                  generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Validation

                                  +

                                  After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                                  +

                                  Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/reference/index.html b/branch-4.7/reference/index.html new file mode 100644 index 000000000..4f70f918e --- /dev/null +++ b/branch-4.7/reference/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Stack Reference Guide

                                  +
                                  +
                                  +

                                  There are several reference guides available which give additional information. Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/reference/matrix.html b/branch-4.7/reference/matrix.html new file mode 100644 index 000000000..6ac511196 --- /dev/null +++ b/branch-4.7/reference/matrix.html @@ -0,0 +1,867 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Stack Support Matrix

                                  +

                                  The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                                  + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                                  Scylla Monitoring Stack Version

                                  Scylla Open Source Version

                                  Scylla Enterprise Version

                                  Node_exporter[1] Version

                                  Scylla Manager Version

                                  4.7

                                  5.2, 5.4, 6.0

                                  2022.1, 2022.2, 2023.1, 2024.1

                                  1.7.0

                                  3.2

                                  4.6

                                  5.2, 5.4

                                  2021.1, 2022.1, 2022.2, 2023.1, 2024.1

                                  1.4.1

                                  3.0, 3.1, 3.2

                                  4.5

                                  5.0,5.1,5.2,5.4

                                  2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                  1.4.1

                                  3.0, 3.1, 3.2

                                  4.4.5

                                  5.0,5.1,5.2,5.4

                                  2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                  1.4.1

                                  3.0, 3.1, 3.2

                                  4.4

                                  5.0,5.1,5.2

                                  2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                  1.4.1

                                  3.0, 3.1

                                  4.3

                                  5.0,5.1,5.2

                                  2020.1, 2021.1, 2022.1, 2022.2

                                  1.4.1

                                  2.5, 2.6, 3.0

                                  4.2

                                  4.5,4.6,5.0,5.1

                                  2020.1, 2021.1, 2022.1, 2022.2

                                  1.4.1

                                  2.5, 2.6, 3.0

                                  4.1

                                  4.5,4.6,5.0,5.1

                                  2020.1, 2021.1, 2022.1, 2022.2

                                  0.17

                                  2.5, 2.6, 3.0

                                  4.0

                                  4.3, 4.4, 4.5, 4.6, 5.0

                                  2020.1, 2021.1, 2022.1

                                  0.17

                                  2.3, 2.4, 2.5, 2.6, 3.0

                                  3.11

                                  4.3, 4.4, 4.5, 4.6, 5.0

                                  2020.1, 2021.1, 2022.2

                                  0.17

                                  2.3, 2.4, 2.5, 2.6

                                  3.10

                                  4.3, 4.4, 4.5, 4.6

                                  2020.1, 2021.1

                                  0.17

                                  2.3, 2.4, 2.5, 2.6

                                  3.9

                                  4.3, 4.4, 4.5, 4.6

                                  2020.1, 2021.1

                                  0.17

                                  2.3, 2.4, 2.5

                                  3.8

                                  4.3, 4.4, 4.5

                                  2020.1, 2021.1

                                  0.17

                                  2.3, 2.4, 2.5

                                  3.7

                                  4.2, 4.3, 4.4

                                  2019.1, 2020.1, 2021.1

                                  0.17

                                  2.2, 2.3

                                  3.6.3

                                  4.2, 4.3, 4.4

                                  2019.1, 2020.1, 2021.1

                                  0.17

                                  2.2, 2.3, 2.1

                                  3.6

                                  4.1, 4.2, 4.3

                                  2019.1, 2020.1

                                  0.17

                                  2.1, 2.2, 2.3

                                  3.6.1

                                  4.1, 4.2, 4.3

                                  2019.1, 2020.1

                                  0.17

                                  2.1, 2.2

                                  3.6.1

                                  4.1, 4.2, 4.3, 4.4

                                  2019.1, 2020.1

                                  0.17

                                  2.1, 2.2

                                  3.5

                                  3.3, 4.0, 4.1, 4.2

                                  2019.1, 2020.1

                                  0.17

                                  2.0, 2.1, 2.2

                                  3.4.3

                                  3.3, 4.0, 4.1, 4.2

                                  2019.1, 2020.1

                                  0.17

                                  2.0, 2.1

                                  3.4

                                  3.3, 4.0, 4.1

                                  2018.1, 2019.1

                                  0.17

                                  2.0, 2.1

                                  3.3

                                  3.1, 3.2, 3.3, 4.0

                                  2018.1, 2019.1

                                  0.17

                                  1.4, 2.0, 2.1

                                  3.2

                                  3.1, 3.2, 3.3

                                  2018.1, 2019.1

                                  0.17

                                  1.4, 2.0

                                  3.1

                                  2.3, 3.0, 3.1, 3.2

                                  2018.1, 2019.1

                                  0.17

                                  1.3, 1.4, 2.0

                                  3.0

                                  2.3, 3.0, 3.1, 3.2

                                  2018.1, 2019.1

                                  0.17

                                  1.3, 1.4

                                  2.4

                                  2.3, 3.0, 3.1

                                  2018.1, 2019.1

                                  0.14, 0.17

                                  1.3, 1.4

                                  2.3

                                  2.3, 3.0

                                  2018.1, 2019.1

                                  0.14, 0.17

                                  1.3

                                  2.2

                                  2.3, 3.0

                                  2018.1, 2019.1

                                  0.14, 0.17

                                  1.3

                                  2.1

                                  2.3, 3.0

                                  2018.1

                                  0.14, 0.17

                                  1.3

                                  +

                                  [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/reference/monitoring-apis.html b/branch-4.7/reference/monitoring-apis.html new file mode 100644 index 000000000..b253b1c59 --- /dev/null +++ b/branch-4.7/reference/monitoring-apis.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Stack Interfaces

                                  +

                                  Scylla exposes two interfaces for online monitoring, as described below

                                  +
                                  +

                                  Prometheus API

                                  +

                                  By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                                  +

                                  For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                                  +

                                  You can change the Prometheus listening address and port in scylla.yaml file

                                  +
                                  # prometheus port
                                  +# By default, Scylla opens prometheus API port on port 9180
                                  +# setting the port to 0 will disable the prometheus API.
                                  +prometheus_port: 9180
                                  +#
                                  +# prometheus address
                                  +# By default, Scylla binds all interfaces to the prometheus API
                                  +# It is possible to restrict the listening address to a specific one
                                  +prometheus_address: 0.0.0.0
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/robots.txt b/branch-4.7/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.7/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.7/search.html b/branch-4.7/search.html new file mode 100644 index 000000000..932755c2b --- /dev/null +++ b/branch-4.7/search.html @@ -0,0 +1,652 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + + + +
                                  + + + + + +
                                  + + +
                                  + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/searchindex.js b/branch-4.7/searchindex.js new file mode 100644 index 000000000..633cbc865 --- /dev/null +++ b/branch-4.7/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/cloud-integration", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/cloud-integration.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "ScyllaDB Cloud Monitoring Datadog Integration", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "7": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "scylla": [0, 1, 2, 4, 7, 9, 10, 12, 14, 15, 27, 28, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "monitor": [0, 2, 4, 7, 10, 15, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "stack": [0, 2, 4, 7, 10, 12, 13, 15, 23, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "scylladb": [0, 2, 4, 5, 13, 19, 20, 22, 23, 24, 25, 26, 31, 32, 34, 36, 38, 39, 42], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 20, 22, 24, 28, 29, 30, 31, 34, 35, 36, 38, 40, 41, 42], "full": [0, 1, 3, 6, 9, 10, 28], "alert": [0, 1, 3, 5, 6, 9, 12, 13, 14], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 17, 20, 22, 24, 36, 38, 40], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 13, 15, 22, 31, 34, 40, 42], "open": [0, 1, 3, 5, 6, 9, 13, 17, 18, 21, 26], "sourc": [0, 1, 3, 5, 6, 9, 10, 17, 21, 22, 40], "tool": [0, 1, 3, 9, 20, 42], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 13, 15, 17, 20, 23, 24, 25, 26, 27, 42], "grafana": [0, 1, 3, 8, 9, 10, 12, 13, 23, 25, 26, 27], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 14, 17, 20, 23, 24, 25, 26, 27, 35, 42, 43], "consist": [1, 9, 10, 13, 22, 35], "three": [1, 2, 6, 10, 26], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 20, 22, 26], "collect": [1, 5, 6, 7, 8, 9, 20, 24, 26, 36, 38], "store": [1, 5, 8, 9, 15, 23, 25, 26, 27, 29, 30, 40], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 15, 17, 22, 23, 24, 25, 27, 42], "alertmanag": [1, 2, 7, 9, 23, 25, 26, 27], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 18, 22, 28, 42], "choos": [1, 3, 9, 11, 12, 13, 14, 16, 19, 20, 43], "topic": [1, 3, 9, 11, 14, 16, 19, 43], "get": [1, 6, 8, 9, 10, 15, 26, 29, 39, 40, 41, 42], "start": [1, 3, 5, 8, 9, 10, 12, 13, 15, 22, 23, 24, 25, 27, 34], "user": [1, 2, 6, 7, 9, 13, 14, 28, 42], "guid": [1, 6, 9, 12, 13, 14, 20, 21], "download": [1, 5, 6, 9, 12, 13, 22, 23, 24, 25, 26, 27], "instal": [1, 2, 9, 20], "procedur": [1, 5, 6, 9, 20, 21], "troubleshoot": [1, 9], "refer": [1, 6, 9, 14], "upgrad": [1, 10, 13, 14], "lesson": [1, 9, 29, 30, 31], "univers": [1, 9], "github": [1, 5, 6, 23, 25, 26, 27], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 13, 15, 26, 28, 42], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 23, 24, 25, 26, 27, 31, 33, 34, 41, 42, 43], "can": [2, 5, 6, 7, 8, 10, 12, 13, 15, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 31, 34, 35, 42, 43], "all": [2, 3, 5, 6, 8, 10, 12, 13, 15, 18, 20, 22, 24, 28, 32, 35, 42], "sh": [2, 3, 6, 20, 22, 23, 24, 25, 26, 27], "kill": [2, 6, 20, 22, 24], "script": [2, 3, 6, 7, 15, 24], "an": [2, 4, 5, 7, 8, 9, 13, 15, 20, 22, 24, 26, 33, 35, 36, 38, 40, 42], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 15, 18, 22, 26], "requir": [2, 8, 29, 32, 36, 42], "more": [2, 4, 5, 6, 10, 15, 18, 20, 28, 31, 34, 36, 39, 42], "manual": [2, 20], "step": [2, 8, 15, 20, 22, 23, 24, 25, 26, 27], "onc": [2, 12, 13, 22, 26, 33, 40, 42], "configur": [2, 7, 10, 15, 18, 20, 22, 34, 35], "simplifi": [2, 13], "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 22, 23, 24, 25, 26, 27, 34, 35, 36, 37, 40, 41, 42, 43], "two": [2, 6, 7, 8, 13, 15, 18, 22, 25, 26, 27, 40, 42], "wai": [2, 5, 7, 10, 13, 20, 26, 42], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 13, 15, 20, 22, 24, 25, 26, 27, 28, 29, 32, 33, 39, 42], "one": [2, 6, 7, 18, 20, 22, 23, 24, 25, 26, 27, 29, 31, 32, 34, 36, 42], "both": [2, 5, 6, 13, 20, 23, 25, 26, 27, 42], "In": [2, 6, 10, 15, 20, 22, 26, 34, 42], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 13, 15, 20, 28, 40, 42], "updat": [2, 5, 10, 15, 20, 22], "yml": [2, 5, 6, 7, 8, 10, 13, 20, 22, 23, 24, 25, 26, 27, 34, 42], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 13, 15, 20, 22, 23, 25, 26, 27, 30, 34, 36, 41, 42], "make": [2, 5, 6, 7, 8, 10, 15, 20, 22, 23, 24, 25, 26, 27, 42], "sure": [2, 5, 6, 8, 10, 15, 20, 22, 23, 24, 25, 26, 27, 42], "have": [2, 4, 5, 6, 7, 8, 10, 15, 20, 25, 26, 27], "among": [2, 35], "other": [2, 8, 9, 10, 13], "ip": [2, 5, 6, 7, 8, 13, 18, 20, 22, 23, 25, 26, 27], "address": [2, 5, 6, 7, 8, 13, 18, 20, 22], "either": [2, 6], "locat": [2, 7, 10, 22, 24, 35], "scylla_serv": [2, 5, 6, 20, 22, 23, 24, 25, 26, 27, 42], "consul": [2, 7], "manag": [2, 5, 14, 17, 19, 27], "config": [2, 5, 7, 13], "gener": [2, 5, 6, 9, 10, 12, 13, 42], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 13, 20, 22, 23, 24, 25, 26, 27, 35, 36, 42], "For": [2, 4, 5, 6, 7, 10, 12, 13, 15, 18, 20, 22, 26, 35, 36, 39, 42], "product": [2, 7], "system": [2, 7, 9, 10, 11, 20, 23, 25, 26, 27, 29, 34, 35, 42], "advis": [2, 35, 42], "extern": [2, 5, 7, 8, 10, 12, 15, 20, 23, 25, 26, 27, 42], "directori": [2, 5, 7, 8, 10, 15, 22, 23, 24, 25, 26, 27], "databas": [2, 5, 7, 22, 31, 42], "accordingli": [2, 12, 13], "see": [2, 4, 5, 6, 10, 12, 13, 15, 18, 20, 22, 23, 24, 25, 26, 27, 34, 42], "below": [2, 5, 6, 10, 15, 18, 20], "read": [2, 5, 6, 8, 9, 10, 12, 20, 22, 27, 28, 32, 34], "its": [2, 5, 6, 7, 8, 9, 15, 22], "from": [2, 5, 7, 8, 9, 10, 12, 13, 22, 23, 24, 25, 26, 27, 28, 37, 42], "note": [2, 5, 6, 7, 20, 22, 23, 25, 26, 27], "latter": 2, "tell": 2, "where": [2, 5, 6, 15, 20, 22, 26, 42], "themselv": [2, 15], "which": [2, 8, 12, 14, 15, 16, 17, 20, 34, 36, 38, 40, 42], "differ": [2, 5, 6, 7, 8, 10, 13, 15, 22, 23, 24, 25, 26, 27, 33, 42], "run": [2, 3, 5, 6, 7, 8, 9, 12, 13, 15, 17, 20, 22, 24, 34, 41], "follow": [2, 4, 5, 6, 7, 10, 12, 13, 15, 17, 20, 22, 23, 25, 26, 27, 34, 42], "command": [2, 6, 8, 20, 22, 23, 25, 26, 27, 34], "datasourc": [2, 5, 6, 8, 15], "under": [2, 5, 6, 10, 13, 26], "yaml": [2, 5, 10, 12, 13, 18], "To": [2, 4, 5, 6, 12, 13, 15, 18, 22, 23, 24, 25, 26, 27], "sashboard": 2, "t": [2, 15, 26], "line": [2, 5, 6, 7, 8, 15, 22, 26, 34], "flag": [2, 6, 7, 8, 15, 20, 22, 23, 25, 26, 27], "v": [2, 6, 7, 8, 15, 20], "specifi": [2, 6, 7, 10, 15, 20, 22, 27, 34], "version": [2, 5, 7, 15, 17, 20], "enterpris": [2, 6, 15, 17], "2020": [2, 6, 15, 17], "1": [2, 5, 6, 7, 8, 12, 13, 15, 17, 21, 23, 25, 26, 27], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 13, 15, 20, 22, 23, 24, 25, 26, 27, 28, 29, 32, 34, 37, 41, 42], "your": [2, 5, 6, 7, 8, 10, 11, 12, 13, 15, 18, 20, 22, 23, 25, 26, 27, 29, 30, 31, 42], "pass": [2, 6, 7, 22], "call": [2, 6, 7, 12, 13], "servic": [2, 5, 6, 7, 9, 20], "container_nam": 2, "aalert": 2, "imag": [2, 9, 20], "prom": [2, 8, 20], "v0": [2, 5], "26": [2, 5], "0": [2, 5, 6, 7, 8, 10, 15, 17, 18, 22, 23, 24, 25, 26, 27], "port": [2, 5, 6, 7, 18, 20, 22, 23, 25, 26], "9093": [2, 5], "volum": [2, 4, 5, 6, 23, 25, 26, 27], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 13, 15, 20, 26], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 15, 24, 34], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 15], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 15, 20, 23, 25, 26, 27], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 26, 35], "json": [2, 12, 13, 15], "10": [2, 5, 6, 10, 15, 17], "3000": [2, 5, 6, 23, 25, 26, 27], "1000": [2, 34], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 15, 30, 36, 38, 42], "path": [2, 5, 6, 7, 8, 10, 22, 23, 24, 25, 26, 27], "dir": [2, 7, 8, 23, 25, 26, 27], "loki": [2, 6, 9], "mnt": 2, "9": [2, 6, 17, 26], "5": [2, 5, 6, 15, 17, 20, 27], "3100": [2, 5], "rule": [2, 5, 7, 10, 12, 20, 26, 33, 41], "conf": [2, 5, 6, 12, 13], "promotheu": 2, "aprom": [2, 20, 26], "v2": [2, 5], "51": [2, 20], "9090": [2, 5, 8, 20, 26], "prom_rul": [2, 5, 10, 13, 26], "instead": [2, 5, 6, 8, 12, 13, 20, 26, 42], "target": [2, 5, 7, 15, 18, 20, 22, 24, 27], "place": [2, 6, 7, 8, 10, 13, 15, 42], "mount": 2, "If": [2, 5, 6, 7, 8, 12, 13, 15, 20, 22, 24, 26, 27, 34, 37, 39, 40, 41, 42], "do": [2, 5, 6, 7, 13, 15, 20, 22, 23, 24, 25, 26, 27, 31, 34, 42], "delet": 2, "afterward": 2, "d": [2, 5, 6, 7, 8, 12, 13, 22, 23, 24, 25, 26, 27], "scylla_manager_serv": [2, 5, 6, 20, 22, 24, 25, 26, 27], "node_exporter_serv": [2, 5, 6, 22, 23], "promtail": [2, 5], "3": [2, 4, 5, 6, 15, 17, 21, 36], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 4, 5, 6, 7, 10, 20, 22, 26, 42], "down": [2, 10, 20, 22, 23, 25, 26, 27, 29, 34, 36], "begin": [3, 11, 14, 16, 19, 43], "deploi": [3, 6], "without": [3, 6, 7, 15, 20, 22, 26, 27], "us": [3, 4, 7, 9, 10, 11, 20, 22, 23, 24, 25, 26, 27, 31, 35, 36, 38, 40, 42], "compos": [3, 7], "thano": [3, 9], "cpu": [4, 5, 6, 13, 41], "cluster": [4, 5, 6, 12, 13, 20, 26, 42], "100": [4, 5, 6, 26, 34, 41], "core": [4, 5, 6, 20, 26], "2vcpu": [4, 5, 6], "larger": [4, 5, 6, 15], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 12, 13, 23, 25, 26, 34, 36, 40], "storag": [4, 5, 6, 7, 9, 15, 26], "retent": [4, 5, 6, 22, 26], "period": [4, 5, 6, 8, 10, 20, 22, 34, 40], "section": [4, 5, 6, 10, 12, 13, 20, 22, 25, 26, 27, 42], "network": [4, 5, 6, 7, 20], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 20], "perform": [4, 5, 6, 20, 26, 34, 35, 39, 42], "block": [4, 5, 6, 26], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 26, 31, 35, 36, 38, 42], "default": [4, 5, 6, 7, 10, 12, 13, 15, 18, 20, 22, 24, 26, 27, 32, 42], "15": [4, 5, 6, 22, 26], "dai": [4, 5, 6, 7, 22, 26], "around": [4, 5, 6, 20], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 13, 20, 42], "assum": [4, 5, 6, 7, 8, 10, 23, 25, 26, 27], "scrape": [4, 5, 6, 13], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 39], "6": [4, 5, 6, 15, 17], "node": [4, 5, 7, 12, 13, 17, 20, 22, 29, 30, 31, 35, 36, 38, 39, 42], "each": [4, 5, 7, 8, 9, 10, 15, 17, 20, 27, 29, 31, 35, 40, 42], "16": [4, 5, 6, 20], "so": [4, 5, 6, 7, 8, 10, 13, 15, 20, 22, 26, 31, 42], "total": [4, 5, 6, 8, 15, 26], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 22, 24, 33, 40, 42], "need": [4, 5, 6, 7, 8, 10, 12, 13, 15, 20, 26, 29, 30, 31, 41, 42], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 13, 15, 20, 37, 41, 42], "replac": [4, 5, 6, 8, 12, 13, 15, 23, 25, 26, 27], "ad": [4, 5, 6, 7, 14], "we": [4, 5, 6, 8, 9, 12, 13, 15, 23, 25, 26, 27, 42], "alloc": [4, 5, 6], "least": [4, 5, 6, 26], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 15, 20, 22, 26, 29, 34, 42], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 15, 20, 40, 42], "fast": [4, 5, 6, 41], "enough": [4, 5, 6, 41], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 15, 20, 22, 26, 29, 35, 42], "out": [4, 5, 6, 8, 10, 41], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 35, 36, 38], "over": [4, 5, 6, 26], "longer": [4, 5, 6, 15, 22, 24, 26], "durat": [4, 5, 6, 7, 10, 26], "e": [4, 5, 6, 15, 26], "g": [4, 5, 6, 7, 22, 23, 25, 26, 27], "look": [4, 5, 6, 8, 10, 12, 13, 15, 26, 42], "week": [4, 5, 6, 7, 26], "view": [4, 5, 12, 13], "would": [4, 5, 6, 8, 10, 15, 22, 26, 28, 31, 42], "take": [4, 5, 6, 7, 15, 20, 22, 26], "than": [4, 5, 6, 10, 15, 22, 26, 42], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 26, 35], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 20, 24, 36], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 12, 15, 18, 22, 27, 42], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 23, 25, 26, 27], "help": [5, 7, 10, 13, 15, 42], "pleas": [5, 7, 20], "most": [5, 10, 15, 26, 37, 42], "common": [5, 7, 10, 42], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 10, 20], "standalon": [5, 20], "thei": [5, 6, 7, 10, 13, 15, 39, 40], "alreadi": [5, 23, 25, 26, 27], "consolid": 5, "suggest": [5, 13, 15, 26], "those": [5, 12, 13, 26, 27], "offici": 5, "document": [5, 6, 8, 10, 15, 20, 22, 23, 24, 25, 26, 27], "also": [5, 6, 7, 8, 10, 15], "main": [5, 22, 40], "item": 5, "avail": [5, 6, 8, 10, 13, 14, 15, 16, 29, 42], "data": [5, 7, 9, 10, 12, 13, 15, 22, 23, 24, 25, 27, 28, 29, 30, 31, 35, 36, 38, 39, 41, 42], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 20], "befor": [5, 6, 10, 22, 23, 24, 25, 26, 27, 29, 30, 36, 42], "support": [5, 6, 15, 16, 28, 42], "want": [5, 6, 10, 23, 25, 26, 27], "latest": [5, 6, 7, 23, 25, 26, 27], "releas": [5, 22, 23, 24, 25, 26, 27], "tightli": 5, "compat": [5, 15, 20, 22, 24], "matrix": [5, 16], "cento": [5, 20], "instanc": [5, 6, 10, 12, 13, 15, 26], "wget": [5, 6, 23, 25, 26, 27], "http": [5, 6, 8, 20, 22, 23, 25, 26, 27, 31, 32, 39], "com": [5, 6, 23, 25, 26, 27, 31, 32, 39], "archiv": [5, 6, 23, 25, 26, 27], "ref": 5, "tag": 5, "tar": [5, 6, 23, 25, 26, 27], "gz": [5, 6], "xvf": [5, 6], "test": [5, 20, 23, 42], "linux": 5, "amd64": 5, "copi": [5, 20, 22, 23, 24, 25, 27], "file": [5, 7, 8, 10, 12, 13, 15, 18, 22, 24, 34], "cp": [5, 23, 24, 25, 26, 27], "p": [5, 7, 8, 20, 22, 23, 25, 26, 27], "cd": [5, 6, 23, 25, 26, 27], "verifi": [5, 10, 24], "point": [5, 6, 15, 23, 25, 26, 27], "browser": [5, 6, 8, 15, 20, 23, 25, 26, 27], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 20, 26], "aggreg": [5, 12, 13], "inspir": 5, "central": [5, 9], "check": [5, 10, 13, 20, 23, 25, 26, 27, 37, 38, 42], "recomand": 5, "local": [5, 6, 7, 8, 9, 15, 20, 23, 25, 26, 27, 42], "describ": [5, 6, 8, 18, 20, 42], "respons": [5, 10], "pars": [5, 9, 15, 33, 42], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 36, 38], "load": [5, 6, 10, 12, 13, 20, 26, 28, 31, 32, 42], "multipl": [5, 6, 7, 8, 9, 10, 15, 29, 32, 33, 39, 41, 42], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 13, 20, 22, 23, 25, 27], "relat": [5, 13, 42], "modifi": [5, 14], "mkdir": 5, "templat": [5, 6, 8, 13, 20, 22, 42], "edit": [5, 6, 7, 8, 12, 13, 15, 20], "localhost": [5, 7, 26], "loki_ip": 5, "": [5, 6, 7, 9, 10, 15, 28, 29, 37, 40, 42], "49": 5, "besid": [5, 7, 22, 42], "expect": [5, 10, 23, 25, 26, 27], "scrap": [5, 7, 12, 13], "job": [5, 6, 20], "onli": [5, 6, 7, 12, 13, 20, 22, 24, 26, 31, 33, 34, 40, 42], "import": [5, 6, 7, 10, 12, 13, 22, 23, 25, 26, 27, 34], "record": [5, 7, 12, 20, 26], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 13, 15, 22, 23, 25, 26, 27], "sudo": [5, 6, 20], "promethu": [5, 12, 26], "non": [5, 20, 22, 30, 31, 35, 39, 42], "root": [5, 6, 20, 23, 25, 26, 27], "give": [5, 14, 16], "write": [5, 26, 30], "execut": [5, 7, 28, 33], "permiss": [5, 6, 22], "correct": [5, 24, 42], "static": [5, 34], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 22, 27], "host": [5, 6, 7, 9, 20, 27], "static_config": [5, 6], "127": [5, 7, 20], "right": [5, 6, 15, 42], "typic": [5, 12, 13, 15, 26, 29, 31, 40, 42], "node_export": [5, 6, 7, 9, 13, 17, 27], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 12, 13, 15, 18, 20, 22, 24, 32, 42], "everi": [5, 6, 7, 26], "scrape_timeout": 5, "timeout": [5, 41], "try": [5, 20], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 12, 13, 26], "ani": [5, 6, 10, 15, 20, 35, 42], "seri": [5, 8], "commun": [5, 19], "feder": 5, "remot": 5, "external_label": [5, 22], "scrape_config": [5, 22], "job_nam": [5, 6, 13], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": [5, 13], "target_label": 5, "9180": [5, 18, 20], "There": [5, 6, 8, 10, 14, 15, 16, 26, 39, 41, 43], "found": [5, 6, 7, 10, 15], "must": [5, 6, 12, 36], "even": [5, 6, 7, 12, 13, 20], "center": [5, 6, 8, 42], "cat": 5, "list": [5, 6], "end": [5, 6, 10, 22, 42], "66": [5, 20], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 13, 26], "dc1": [5, 6], "172": [5, 6, 20], "17": [5, 6, 17, 20, 24], "dc2": [5, 6], "previou": [5, 25, 26, 27], "deprec": 5, "5090": [5, 6, 20], "tsdb": [5, 7, 8, 26], "accumul": 5, "consol": [5, 20], "visibl": [5, 12, 13], "through": 5, "node_memory_memfre": 5, "And": [5, 15, 23, 25, 27], "scylla_reactor_util": 5, "At": [5, 15, 25, 26, 27], "emit": 5, "abl": [5, 8, 22, 24, 26], "them": [5, 7, 9, 10, 13, 15, 24, 35], "grafna": 5, "here": [5, 6, 7, 10, 22], "depend": [5, 8, 26], "repositori": [5, 6], "yum": 5, "zip": [5, 23, 25, 26, 27], "structur": 5, "dnf": 5, "access": [5, 7, 12], "r": [5, 7, 15, 20], "provis": [5, 15], "manager_3": 5, "just": [5, 15], "apivers": 5, "name": [5, 6, 8, 10, 13, 20, 24, 42], "orgid": 5, "folder": 5, "type": [5, 15, 42], "disabledelet": 5, "allowuiupd": 5, "updateintervalsecond": 5, "how": [5, 7, 8, 10, 15, 23, 25, 26, 27, 29, 30, 31, 35, 42], "often": 5, "scan": [5, 28], "chang": [5, 7, 15, 18, 20, 22, 23, 24, 25, 26, 27], "option": [5, 6, 8, 9, 12, 13, 20, 22, 26, 34], "ver_5": 5, "A": [5, 7, 8, 9, 12, 13, 15, 29, 30, 36, 40, 42], "otherwis": 5, "some": [5, 8, 10, 12, 13, 20, 26, 35, 39], "tabl": [5, 6, 10, 17, 28, 35, 42], "url": [5, 8, 22, 26], "167": 5, "proxi": [5, 12], "basicauth": 5, "camptocamp": 5, "typelogourl": 5, "public": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 35, 43], "connect": [5, 8, 15, 18, 20], "between": [5, 8, 12, 13, 20, 22, 23, 25, 26, 27, 34, 42], "strongli": [5, 42], "encourag": 5, "restrict": [5, 18], "keyspac": [5, 6], "part": [5, 6, 10, 24, 28, 31, 42], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 15, 22], "detail": [5, 10, 34, 35], "done": [5, 6, 7, 13, 15, 20, 26], "first": [5, 12, 13, 23, 25, 26, 27, 42], "new": [5, 6, 12, 13, 20, 40], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 42], "AND": 5, "login": [5, 6, 20], "proper": [5, 20], "select": [5, 35, 42], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 15, 27, 33, 34], "mention": [5, 15], "previous": [5, 25, 26, 27], "safer": [5, 42], "dedic": [5, 6], "limit": [5, 6, 8, 10, 32, 34, 42], "privileg": [5, 6, 7, 26], "un": [5, 26], "comment": 5, "relev": [5, 7, 26, 35], "usernam": 5, "unsign": 5, "ini": 5, "allow_loading_unsigned_plugin": 5, "setup": 6, "pull": [6, 20], "evalu": [6, 7, 26], "laptop": 6, "48": 6, "47": 6, "44": 6, "42": 6, "8": [6, 17, 20, 22, 26], "41": 6, "38": 6, "34": 6, "11": [6, 17], "32": 6, "29": 6, "27": [6, 15], "25": [6, 20], "18": 6, "avoid": [6, 15, 20, 32, 42], "go": [6, 12, 13, 20], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 10, 23, 25, 26, 27], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 13, 20, 22], "extract": 6, "binari": [6, 20], "clone": 6, "git": 6, "directli": [6, 9, 13], "checkout": 6, "restart": [6, 7, 8, 12, 13, 22], "know": [6, 20, 31, 42], "higher": [6, 10, 26, 31, 42], "wish": [6, 7], "match": [6, 42], "datacent": 6, "nodetool": 6, "statu": [6, 20, 26], "valid": 6, "ipv6": 6, "insid": [6, 7, 15, 20], "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 22], "listen": [6, 7, 18, 22], "set": [6, 7, 10, 15, 18, 34], "inform": [6, 7, 14, 15, 16, 18, 26, 28, 29, 30], "agent": [6, 7, 8, 9, 17, 20, 27], "machin": [6, 7, 12, 13, 20, 24], "overrid": [6, 7, 15], "n": [6, 7, 27], "my_scylla_serv": 6, "prometheus_data": 6, "mark": [6, 12, 13], "seen": 6, "genconfig": 6, "py": [6, 15], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 20, 23, 25, 26, 27], "within": [6, 10, 15], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 39], "outsid": [6, 7, 22], "result": [6, 7, 13, 22, 29, 31, 32, 34, 40, 42], "lost": [6, 7, 15, 42], "exist": [6, 10, 15, 42], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 34, 42], "firewal": [6, 20], "7000": [6, 20], "myservic": 6, "m": [6, 7, 22, 23, 25, 26, 27], "2019": [6, 17, 39], "reach": [6, 8, 12, 13, 31, 34, 36, 42], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 31, 32, 36, 38, 42], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 15, 20], "authent": [6, 7], "disabl": [6, 18, 20], "simplest": 7, "small": [7, 12, 13, 40], "util": [7, 15, 24, 26], "appropri": 7, "h": [7, 15], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 13, 26, 36, 41], "map": 7, "bind": [7, 18], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 12, 22, 26, 30, 33, 35], "addit": [7, 8, 9, 10, 14, 16, 26, 42], "specif": [7, 10, 12, 13, 18, 20, 37, 42], "driver": [7, 31, 32, 39, 42], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 20, 41], "experiment": 7, "initi": 7, "stage": 7, "process": [7, 22, 34, 41], "firstli": 7, "along": 7, "env": 7, "prerequisit": 7, "gui": [7, 15, 20], "keep": [7, 22, 26], "clear": 7, "comma": 7, "separ": [7, 10], "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 13, 15, 26], "mean": [7, 15, 22, 28, 29, 30, 31, 32, 36, 38, 42], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 15], "b": [7, 26], "o": [7, 13, 17, 24, 27, 35], "disk": [7, 10, 13, 15, 20, 28, 30, 35], "possibl": [7, 10, 18, 42], "api": [7, 8, 22], "resolv": 7, "explicitli": [7, 15], "ca": 7, "optim": [7, 33, 39, 43], "drop": [7, 41, 42], "while": [7, 10, 20, 22, 23, 25, 26, 27, 34], "cdc": 7, "request": [7, 18, 41], "someth": [7, 10, 11, 15, 26, 40], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 10, 15, 20], "horizont": 8, "scale": [8, 41], "backup": 8, "benefit": [8, 42], "flexibl": 8, "design": 8, "rest": [8, 26], "front": 8, "few": [8, 9, 23, 25, 26, 27], "reason": [8, 15, 20, 26, 38, 42], "why": 8, "million": 8, "singl": [8, 15], "capac": 8, "sometim": [8, 12, 13], "traffic": [8, 20, 39, 42], "reachabl": [8, 22], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 15, 22, 23, 25, 26, 27, 30], "expos": [8, 18, 22], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 35], "10903": 8, "10904": 8, "replica": [8, 29, 30, 31, 35, 36, 42], "abov": [8, 23, 25, 26, 27], "last": [8, 26], "db_address": 8, "could": [8, 35, 39, 41, 42], "long": [8, 10, 26, 40], "now": [8, 10, 26], "grafan": 9, "render": [9, 15], "sidecar": 9, "db": 9, "receiv": [9, 10, 42], "distribut": [9, 31, 39, 42], "email": [9, 10], "slack": [9, 10, 19], "displai": [9, 12, 13, 24], "enhanc": [10, 11], "notifi": [10, 11], "wrong": [10, 11, 15, 20, 26, 27, 40, 42], "shown": [10, 20, 23, 25, 26, 27], "condit": 10, "met": 10, "certain": 10, "defin": [10, 15, 22, 42], "what": [10, 26], "happen": [10, 20], "report": [10, 13, 17, 20, 42], "let": [10, 12, 13, 22, 27], "u": 10, "instancedown": 10, "expr": [10, 15, 26], "60": [10, 26], "error": [10, 15, 26, 35, 36, 38], "annot": 10, "descript": [10, 35], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 15, 23], "special": 10, "notif": 10, "forward": 10, "low": [10, 42], "info": 10, "warn": [10, 35], "critic": 10, "inhibit": 10, "prioriti": 10, "mute": 10, "lower": [10, 42], "space": 10, "threshold": 10, "fire": 10, "silenc": 10, "signal": 10, "action": 10, "pager": 10, "duti": 10, "extens": 10, "easier": [10, 15], "dure": [10, 13, 20, 23, 25, 26, 27], "practic": [10, 35, 39], "suitabl": 10, "rememb": 10, "overridden": [10, 15], "duplic": [10, 42], "rout": [10, 31, 42], "repres": 10, "tree": 10, "win": [10, 20], "via": [10, 20], "sluck": 10, "wors": 10, "correctli": [10, 15, 22, 24], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 24, 26], "reduc": [10, 15, 29], "simul": 10, "actual": [10, 38], "show": [10, 15, 17, 26, 42], "propag": 10, "valu": [10, 15, 33, 34, 40, 42], "similar": [10, 15], "free": 10, "big": [10, 42], "bisect": 10, "problem": [10, 35, 41, 42], "thousand": [12, 13], "ten": [12, 13], "sheer": [12, 13], "too": [12, 13, 15, 34, 40], "much": [12, 13, 34, 42], "subset": [12, 13], "move": 12, "id": [12, 15, 20], "cluster_id": 12, "token": [12, 35], "shard": [12, 13, 20, 26, 35], "dd": [12, 13], "resembl": [12, 13, 15], "filter": [12, 13, 35], "perspect": [12, 13], "graph": [12, 13, 15, 22, 24, 26, 42], "pai": [12, 13], "attent": [12, 13], "combin": [12, 13], "conflict": [12, 13], "remov": [12, 13, 22], "safest": 13, "cloud": [13, 14], "relabel": 13, "cost": [13, 42], "miss": [13, 20, 26], "origin": [13, 15, 26, 37], "export": [13, 20], "search": 13, "find": 13, "metric_relabel_config": 13, "think": 13, "issu": [13, 15, 20, 35, 39, 42], "ll": 13, "sever": [14, 16, 43], "datadog": [14, 20], "integr": [14, 19], "explain": [15, 23, 25, 26, 27, 35], "intern": [15, 31, 42], "potenti": [15, 35, 42], "whenev": 15, "save": 15, "earlier": 15, "perman": 15, "eventu": 15, "made": 15, "larg": [15, 35], "maintain": 15, "verbos": 15, "element": [15, 35], "object": 15, "attribut": 15, "aliascolor": 15, "bar": 15, "fill": [15, 41], "grid": 15, "threshold1": 15, "null": 15, "threshold1color": 15, "rgba": 15, "216": 15, "200": 15, "threshold2": 15, "threshold2color": 15, "234": 15, "112": 15, "22": 15, "gridpo": 15, "w": [15, 20], "x": [15, 20, 21], "y": [15, 21], "isnew": 15, "legend": 15, "avg": 15, "max": 15, "min": 15, "linewidth": 15, "link": [15, 35], "nullpointmod": 15, "percentag": [15, 42], "pointradiu": 15, "flot": 15, "seriesoverrid": 15, "span": 15, "steppedlin": 15, "sum": [15, 26], "node_filesystem_avail": 15, "intervalfactor": 15, "legendformat": 15, "refid": 15, "timefrom": 15, "timeshift": 15, "titl": 15, "size": [15, 32, 42], "tooltip": 15, "msresolut": 15, "share": [15, 27, 34], "sort": [15, 42], "value_typ": 15, "cumul": 15, "transpar": 15, "xaxi": 15, "yax": 15, "percent": 15, "logbas": 15, "101": 15, "short": 15, "imagin": 15, "redund": 15, "css": 15, "hierarch": 15, "definit": [15, 22, 42], "inherit": 15, "row": [15, 42], "base_row": 15, "collaps": 15, "height": 15, "250px": 15, "Will": 15, "150px": 15, "output": 15, "consid": 15, "bytes_panel": 15, "byte": 15, "unit": 15, "axi": 15, "adjust": 15, "readabl": 15, "gb": 15, "mb": 15, "grasp": 15, "12": [15, 20, 26], "wa": [15, 42], "break": [15, 32, 42], "later": 15, "were": [15, 22, 42], "absolut": 15, "posit": 15, "width": 15, "backward": [15, 20, 22, 24], "ve": 15, "had": 15, "imposs": 15, "hand": 15, "overcom": 15, "transit": [15, 20, 24, 26], "calcul": [15, 20, 26], "taken": [15, 22], "still": [15, 26], "unlik": 15, "partial": 15, "24": [15, 26], "don": [15, 26], "python": 15, "pyyaml": 15, "make_dashboard": 15, "revers": 15, "usual": [15, 20, 35, 42], "wrapper": 15, "re": [15, 31], "refresh": 15, "generate_gener": 15, "ran": 15, "mayb": 15, "interfac": [16, 20], "2022": 17, "2023": 17, "2024": 17, "2021": 17, "2018": [17, 32], "14": [17, 20], "onlin": 18, "prometheus_port": 18, "prometheus_address": 18, "ask": 19, "question": 19, "discuss": 19, "forum": 19, "channel": 19, "56090": 20, "old": [20, 23, 24, 25, 26, 27], "howev": 20, "twice": 20, "easiest": 20, "scylla_manager1": 20, "messag": 20, "wait": [20, 36], "post": 20, "past": [20, 24], "mai": [20, 34, 36, 42], "ownership": 20, "la": 20, "grep": 20, "drwxr": 20, "xr": 20, "4096": 20, "jun": 20, "chown": 20, "appear": 20, "unreach": [20, 36], "immedi": 20, "suspect": 20, "tab": 20, "rang": [20, 26, 42], "align": 20, "On": 20, "41bd3db26240": 20, "entrypoin": 20, "ago": [20, 26], "23": 20, "7001": 20, "tcp": 20, "9042": 20, "9160": 20, "10000": 20, "click": 20, "usag": [20, 31, 42], "fetch": 20, "curl": 20, "scylla_nod": 20, "return": [20, 22, 28, 29, 30, 32, 36, 38, 42], "ef": 20, "gre": 20, "scylla_setup": 20, "9100": 20, "fallback": 20, "mechan": [20, 26, 29], "present": [20, 26], "newer": [20, 25, 26, 27], "reli": [20, 26, 42], "clean": 20, "recommend": [20, 23, 25, 26, 27, 42], "increas": [20, 32, 34, 42], "might": [20, 40], "overload": 20, "sysconfig": 20, "collector": 20, "captur": 20, "tshark": 20, "f": 20, "dst": 20, "eth0": 20, "toward": 20, "199": 20, "203": 20, "229": 20, "89": 20, "142": 20, "59212": 20, "ack": 20, "seq": 20, "317": 20, "78193": 20, "158080": 20, "len": 20, "tsval": 20, "79869679": 20, "tsecr": 20, "3347447210": 20, "74": 20, "60440": 20, "syn": 20, "29200": 20, "mss": 20, "1460": 20, "sack_perm": 20, "79988291": 20, "128": 20, "sinc": 22, "parallel": [22, 23, 25, 26, 27], "migrat": [22, 23, 25, 27], "lose": 22, "histor": [22, 26], "safe": 22, "page": [22, 24, 35], "unzip": [22, 23, 24, 25, 26, 27], "3001": [22, 23, 25, 26, 27], "9091": [22, 23, 25, 26, 27], "9094": 22, "fail": [22, 29, 31, 35, 42], "loss": 22, "everyth": 22, "stop": [22, 23, 24, 25, 26, 27], "format": [22, 26], "rule_fil": 22, "9111": 22, "phase": [22, 24], "serv": 22, "remote_read": 22, "v1": 22, "histori": [22, 24], "continu": [22, 23, 25, 26, 27], "back": [22, 29], "uninstal": [23, 25, 26, 27], "minor": [23, 25, 26, 27], "9095": [23, 25, 26, 27], "brows": [23, 25, 26, 27], "satisfi": [23, 25, 26, 27], "shut": [23, 25, 26, 27], "caus": [23, 25, 26, 27, 31, 42], "blackout": [23, 25, 26, 27], "normal": [23, 25, 26, 27], "oper": [23, 25, 26, 27, 35, 42], "complet": [23, 25, 26, 27], "switch": [24, 26], "fulli": 24, "affect": 24, "older": [24, 25, 26, 27], "helper": 24, "node_exporter_instal": 24, "ship": 24, "sub": 24, "color": 24, "simpli": 24, "side": [25, 26, 27, 28, 35, 42], "ensur": 26, "patch": 26, "skip": 26, "entir": 26, "p99": 26, "latenc": [26, 31, 34, 42], "wlatencyp99": 26, "histogram_quantil": 26, "99": 26, "rate": [26, 42], "scylla_storage_proxy_coordinator_write_latency_bucket": 26, "scheduling_group_nam": 26, "le": 26, "fall": [26, 29], "year": 26, "month": 26, "360": 26, "our": 26, "nine": 26, "gap": 26, "minu": 26, "exact": 26, "goe": 26, "revert": 26, "stat": 26, "overlap": 26, "promtool": 26, "90": 26, "epoc": 26, "translat": 26, "mani": [26, 29, 30, 42], "echo": 26, "date": 26, "3600": 26, "exec": 26, "back_fil": 26, "took": 26, "hour": 26, "creation": 26, "inerupt": 26, "split": 26, "smaller": 26, "successfulli": 26, "compact": [26, 41], "half": 26, "itself": 27, "almost": 27, "alwai": [27, 33], "sylladb": 27, "prevent": [27, 42], "primari": [28, 42], "kei": [28, 42], "These": [28, 42], "kind": [28, 42], "bigger": 28, "care": [28, 29, 30, 42], "replicationfactor": [29, 30], "piec": 29, "determin": [29, 30, 36, 42], "repli": [29, 30, 32, 36, 38, 42], "unavail": [29, 42], "client": [29, 32, 35, 42], "respond": 29, "accompani": 29, "deep": 29, "understand": 29, "acknowledg": 30, "coordin": [30, 31, 36, 38, 42], "hint": 30, "fact": 30, "yet": 30, "ideal": [31, 42], "resourc": [31, 42], "replic": [31, 36, 38, 42], "prepar": [31, 35, 39], "statement": [31, 33, 35, 39], "balanc": [31, 34, 35, 42], "polici": 31, "cours": 31, "intro": 31, "recap": 31, "ring": [31, 42], "architectur": 31, "chunk": [32, 42], "overal": [32, 34, 42], "thu": 32, "www": [32, 39], "07": 32, "13": 32, "effici": [32, 42], "concret": 33, "thumb": 33, "favor": 33, "background": [34, 41], "impact": [34, 35], "compaction_static_shar": 34, "50": 34, "indic": [34, 35, 40, 41, 42], "overli": 34, "slow": 34, "enforc": 34, "min_threshold": 34, "compaction_enforce_min_threshold": 34, "bucket": 34, "sstabl": 34, "stc": 34, "recogn": 35, "bad": 35, "solv": 35, "categori": [35, 42], "jump": 35, "cell": 35, "model": [35, 39, 41, 42], "code": 35, "awar": 35, "due": 35, "unsatisfi": 35, "faulti": 35, "cach": 35, "evict": 35, "answer": [36, 38], "aka": 36, "factor": 36, "quorum": [36, 42], "hardwar": [37, 41], "occur": 37, "leav": 38, "risk": 38, "identifi": [38, 42], "evenli": 39, "across": 39, "becom": 39, "bottleneck": 39, "explan": 39, "08": 39, "field": 40, "being": 40, "defi": 40, "purpos": 40, "shed": 41, "repair": 41, "queue": 41, "upper": 42, "gaug": 42, "inspect": 42, "zero": 42, "mislead": 42, "panel": 42, "holder": 42, "inject": 42, "did": 42, "compound": 42, "column": 42, "order": 42, "BY": 42, "ks1": 42, "table_demo": 42, "text": 42, "int": 42, "desc": 42, "cat1": 42, "asc": 42, "overhead": 42, "thing": 42, "major": 42, "success": 42, "hurt": 42, "cl": 42, "expens": 42, "term": 42, "ONE": 42, "local_quorum": 42, "local_on": 42, "nearest": 42, "advisor": 43}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 12, 14, 27], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 35, 43], "stack": [1, 3, 5, 6, 8, 9, 11, 14, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 35, 43], "us": [2, 5, 6, 8, 12, 13, 15, 28, 29, 30, 43], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 15], "set": [2, 5, 22, 23, 25, 26, 27], "prometheu": [2, 4, 5, 6, 7, 8, 10, 18, 22], "grafana": [2, 5, 6, 7, 15, 20], "provis": 2, "data": [2, 6, 8, 20, 26], "sourc": [2, 8, 20], "file": [2, 6, 20, 23, 25, 26, 27], "dashboard": [2, 6, 12, 13, 15], "load": 2, "start": [2, 6, 7, 20, 26], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 13, 22, 23, 24, 25, 26, 27], "scylla": [3, 5, 6, 8, 11, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30, 35, 43], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 15, 22, 41], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 37], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 34], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 20], "configur": [5, 6, 8, 12, 13], "enabl": 5, "compat": 6, "matrix": [6, 17], "post": [6, 12, 13, 26, 32, 39], "node": [6, 37], "from": [6, 15, 20], "manag": [6, 7, 11, 20], "consul": 6, "api": [6, 18], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 20], "add": [6, 13], "addit": 6, "target": 6, "specif": 6, "version": [6, 22, 23, 24, 25, 26, 27], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 15, 23, 25, 26, 27, 35, 42], "all": [7, 23, 25, 26, 27, 29], "sh": [7, 15], "command": 7, "gener": [7, 15], "option": 7, "relat": [7, 22, 23, 24, 25, 26, 27], "ldap": 7, "support": [7, 17], "retent": 7, "period": [7, 26], "alert": [7, 10, 11, 22], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 28, 29, 30, 31, 32, 33, 39, 42], "updat": 8, "high": 9, "level": [9, 20, 29, 30, 36, 42], "architectur": 9, "sever": 10, "ad": [10, 12, 13, 15], "modifi": [10, 15], "tip": 10, "when": 10, "cloud": 12, "datadog": [12, 13], "integr": [12, 13], "overview": [12, 13], "And": [12, 13, 20], "agent": [12, 13], "upload": [12, 13], "record": 13, "rule": [13, 22], "more": 13, "metric": [13, 20, 26], "procedur": [14, 22, 23, 24, 25, 26, 27], "limit": 15, "consist": [15, 29, 30, 36, 42], "between": 15, "restart": [15, 26], "upgrad": [15, 20, 21, 22, 23, 24, 25, 26, 27], "templat": 15, "class": 15, "panel": 15, "exampl": 15, "format": 15, "layout": 15, "valid": [15, 22, 23, 24, 25, 26, 27], "refer": 16, "guid": [16, 19, 22, 23, 24, 25, 26, 27], "interfac": 18, "troubleshoot": [19, 20], "problem": 20, "2": [20, 22, 23, 24], "duplic": 20, "inform": 20, "A": 20, "contain": [20, 23, 25, 26, 27], "fail": [20, 36, 38], "To": 20, "permiss": 20, "No": 20, "point": 20, "solut": 20, "chart": 20, "show": 20, "error": [20, 37], "sign": 20, "server": [20, 23, 25, 26, 27], "notic": 20, "open": 20, "3": [20, 22, 24, 25, 26], "0": 20, "enterpris": 20, "2019": 20, "1": [20, 22, 24], "latenc": 20, "graph": 20, "ar": [20, 31, 32, 33, 39], "empti": 20, "reduc": 20, "total": 20, "number": [20, 27], "remov": 20, "interrupt": 20, "node_export": [20, 24], "work": 20, "wireshark": 20, "x": [22, 23, 24, 25, 26, 27], "latest": 22, "new": [22, 23, 24, 25, 26, 27], "4": [22, 26, 27], "move": [22, 23, 25, 26, 27], "old": 22, "b": [22, 27], "rollback": [22, 23, 24, 25, 26, 27], "link": [22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 39], "y": [23, 25, 26, 27], "": [23, 25, 26, 27], "i": [23, 25, 26, 27, 37], "run": [23, 25, 26, 27], "correct": [23, 25, 26, 27], "correctli": [23, 25, 27], "kill": [23, 25, 26, 27], "test": [25, 26, 27], "mode": [25, 26, 27], "second": 26, "migrat": 26, "backup": 26, "back": 26, "fill": 26, "determin": 26, "backfil": 26, "time": 26, "end": 26, "process": 26, "creat": 26, "copi": 26, "port": 27, "some": [28, 29, 30, 31, 32, 33, 36, 38], "allow": [28, 42], "filter": [28, 42], "univers": [29, 30, 31], "ani": 30, "token": [31, 42], "awar": [31, 42], "select": 32, "non": [32, 33], "page": [32, 42], "blog": [32, 39], "prepar": [33, 40, 42], "compact": 34, "take": 34, "lot": 34, "cpu": 34, "advisor": 35, "section": 35, "oper": [36, 38], "due": 36, "unsatisfi": 36, "o": 37, "can": 37, "indic": 37, "faulti": 37, "replica": 38, "side": 38, "cql": [39, 42], "balanc": 39, "among": 39, "shard": 39, "statement": [40, 42], "cach": 40, "evict": 40, "overload": 41, "optim": 42, "revers": 42, "read": 42, "cross": 42, "dc": 42, "request": 42}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some operations failed on the replica side": [[38, "some-operations-failed-on-the-replica-side"]], "Compaction takes lots of memory and CPU": [[34, "compaction-takes-lots-of-memory-and-cpu"]], "I/O Errors can indicate a node with a faulty disk": [[37, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some SELECT queries are non-paged": [[32, "some-select-queries-are-non-paged"]], "Blog-post Links": [[32, "blog-post-links"]], "Some queries are not token-aware": [[31, "some-queries-are-not-token-aware"]], "University link": [[31, "university-link"]], "Some queries use Consistency Level: ANY": [[30, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[30, "link-to-scylla-university"], [29, "link-to-scylla-university"]], "Some queries are non-prepared": [[33, "some-queries-are-non-prepared"]], "Scylla Monitoring Stack Advisor": [[35, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[35, "the-advisor-section"]], "Some operation failed due to unsatisfied consistency level": [[36, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "CQL queries are not balanced among shards": [[39, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[39, "blog-post-link"]], "Scylla Monitoring Datadog Integration": [[13, "scylla-monitoring-datadog-integration"]], "Scylla Monitoring Datadog Integration Overview": [[13, "scylla-monitoring-datadog-integration-overview"]], "Install And configure the Datadog Agent": [[13, "install-and-configure-the-datadog-agent"], [12, "install-and-configure-the-datadog-agent"]], "Post configuration": [[13, "post-configuration"], [12, "post-configuration"]], "Add datadog recording rules": [[13, "add-datadog-recording-rules"]], "Upload the Dashboard": [[13, "upload-the-dashboard"], [12, "upload-the-dashboard"]], "Using the Dashboard": [[13, "using-the-dashboard"], [12, "using-the-dashboard"]], "Adding Monitor": [[13, "adding-monitor"], [12, "adding-monitor"]], "Adding more metrics to Datadog": [[13, "adding-more-metrics-to-datadog"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alerts severity": [[10, "alerts-severity"]], "Adding Alerts": [[10, "adding-alerts"]], "Modifying Alerts": [[10, "modifying-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[19, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "ScyllaDB Cloud Monitoring Datadog Integration": [[12, "scylladb-cloud-monitoring-datadog-integration"]], "ScyllaDB Monitoring Datadog Integration Overview": [[12, "scylladb-monitoring-datadog-integration-overview"]], "Scylla Monitoring Stack Reference Guide": [[16, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Support Matrix": [[17, "scylla-monitoring-stack-support-matrix"]], "Adding and Modifying Dashboards": [[15, "adding-and-modifying-dashboards"]], "General Limitations": [[15, "general-limitations"]], "Consistency Between Restarts": [[15, "consistency-between-restarts"]], "Consistency Between Upgrades": [[15, "consistency-between-upgrades"]], "Using Templated Dashboards": [[15, "using-templated-dashboards"]], "The Template Class System": [[15, "the-template-class-system"]], "Panel Example": [[15, "panel-example"]], "Grafana Formats and Layouts": [[15, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[15, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[15, "prerequisite"], [2, "prerequisite"]], "Validation": [[15, "validation"], [22, "validation"]], "ScyllaDB Monitoring Stack Procedures": [[14, "scylladb-monitoring-stack-procedures"]], "Scylla Monitoring Stack Interfaces": [[18, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[18, "prometheus-api"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "ScyllaDB Monitoring Stack": [[9, "scylladb-monitoring-stack"], [1, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b": [[27, "upgrade-guide-scylladb-monitoring-4-x-a-to-scylladb-monitoring-4-y-b"]], "Upgrade Procedure": [[27, "upgrade-procedure"], [22, "upgrade-procedure"], [25, "upgrade-procedure"], [24, "upgrade-procedure"], [23, "upgrade-procedure"], [26, "upgrade-procedure"]], "Install 4.y.b (The new version)": [[27, "install-4-y-b-the-new-version"]], "Setting the server\u2019s files": [[27, "setting-the-server-s-files"], [25, "setting-the-server-s-files"], [23, "setting-the-server-s-files"], [26, "setting-the-server-s-files"]], "Validate the port numbers": [[27, "validate-the-port-numbers"]], "Validate the new version is running the correct version": [[27, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"], [23, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[27, "validate-the-version-installed-correctly"], [25, "validate-the-version-installed-correctly"], [23, "validate-the-version-installed-correctly"]], "Killing the new 4.y.b Monitoring stack in testing mode": [[27, "killing-the-new-4-y-b-monitoring-stack-in-testing-mode"]], "Move to version 4.y.b (the new version)": [[27, "move-to-version-4-y-b-the-new-version"]], "Kill all containers": [[27, "kill-all-containers"], [25, "kill-all-containers"], [23, "kill-all-containers"], [26, "kill-all-containers"]], "Rollback to version 4.x.a": [[27, "rollback-to-version-4-x-a"]], "Related Links": [[27, "related-links"], [22, "related-links"], [25, "related-links"], [24, "related-links"], [23, "related-links"], [26, "related-links"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[22, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[22, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[22, "install-the-new-monitoring-stack"], [24, "install-the-new-monitoring-stack"]], "3. Alerting Rules": [[22, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[22, "moving-to-prometheus-2-x"]], "a. Set the old system": [[22, "a-set-the-old-system"]], "b. Set the new system": [[22, "b-set-the-new-system"]], "Validate the upgrade": [[22, "validate-the-upgrade"], [24, "validate-the-upgrade"]], "Rollback": [[22, "rollback"], [24, "rollback"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[25, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[25, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[25, "move-to-version-3-y-the-new-version"]], "Rollback to version 3.x": [[25, "rollback-to-version-3-x"], [26, "rollback-to-version-3-x"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[24, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[24, "validate-node-exporter-version"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[23, "install-2-y-the-new-version"]], "Move to version 2.y (the new version)": [[23, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[23, "rollback-to-version-2-x"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[26, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[26, "install-4-y-the-new-version"]], "Running in test mode": [[26, "running-in-test-mode"]], "Running second monitoring stack": [[26, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[26, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[26, "migrating"]], "Move to version 4.y (the new version)": [[26, "move-to-version-4-y-the-new-version"]], "Backup": [[26, "backup"]], "Post-installation: Metrics back-filling": [[26, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[26, "determine-the-backfilling-period"]], "Determine the start time": [[26, "determine-the-start-time"]], "Determine the end time": [[26, "determine-the-end-time"]], "Backfilling Process": [[26, "backfilling-process"]], "backup": [[26, "id1"]], "Restart the monitoring stack": [[26, "restart-the-monitoring-stack"]], "Create the data files": [[26, "create-the-data-files"]], "Copy the data files": [[26, "copy-the-data-files"]], "Some queries use ALLOW FILTERING": [[28, "some-queries-use-allow-filtering"]], "Troubleshoot Scylla Monitoring Stack": [[20, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[20, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[20, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[20, "a-container-fails-to-start"]], "Files And Directory Permissions": [[20, "files-and-directory-permissions"]], "No Data Points": [[20, "no-data-points"]], "Solution": [[20, "solution"], [20, "id1"], [20, "id2"], [20, "id3"]], "Grafana Chart Shows Error (!) Sign": [[20, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[20, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[20, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[20, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[20, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[20, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[20, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[20, "working-with-wireshark"]], "Upgrade Scylla Monitoring Stack": [[21, "upgrade-scylla-monitoring-stack"]], "Some queries use Consistency Level: ALL": [[29, "some-queries-use-consistency-level-all"]], "System Overload": [[41, "system-overload"]], "Using Scylla Monitoring Stack": [[43, "using-scylla-monitoring-stack"]], "Prepared statements cache eviction": [[40, "prepared-statements-cache-eviction"]], "The CQL Optimization": [[42, "the-cql-optimization"]], "Prepared Statements": [[42, "prepared-statements"]], "Token Aware": [[42, "token-aware"]], "Paged Queries": [[42, "paged-queries"]], "Reversed CQL Reads": [[42, "reversed-cql-reads"]], "ALLOW FILTERING": [[42, "allow-filtering"]], "Consistency Level": [[42, "consistency-level"]], "Cross DC": [[42, "cross-dc"]], "Cross DC Consistency Level": [[42, "cross-dc-consistency-level"]], "Cross DC read requests": [[42, "cross-dc-read-requests"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.7/sitemap.xml b/branch-4.7/sitemap.xml new file mode 100644 index 000000000..041ad8404 --- /dev/null +++ b/branch-4.7/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/cloud-integration.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.7/troubleshooting/index.html b/branch-4.7/troubleshooting/index.html new file mode 100644 index 000000000..486ea8e5e --- /dev/null +++ b/branch-4.7/troubleshooting/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Troubleshooting Guide for Scylla Monitoring Stack

                                  +
                                  +
                                  +

                                  Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/troubleshooting/monitor-troubleshoot.html b/branch-4.7/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..083238aa2 --- /dev/null +++ b/branch-4.7/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,892 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Troubleshoot Scylla Monitoring Stack

                                  +

                                  This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                                  +
                                  +

                                  Problem

                                  +
                                  +

                                  Scylla-Manager 2.2 with Duplicate information

                                  +

                                  Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                                  +
                                    +
                                  • For Manager server: from 56090 to 5090

                                  • +
                                  • For Manager Agent: from 56090 to 5090

                                  • +
                                  +

                                  For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                                  +

                                  However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                                  +

                                  The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                                  +

                                  Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                                  +
                                  +
                                  +

                                  A Container Fails To Start

                                  +

                                  When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                                  +
                                  Wait for Prometheus container to start........Error: Prometheus container failed to start
                                  +
                                  +
                                  +

                                  Should this happen, check the Docker logs for more information.

                                  +
                                  docker logs aprom
                                  +
                                  +
                                  +

                                  Usually the reason for the failure is described in the logs.

                                  +
                                  +
                                  +

                                  Files And Directory Permissions

                                  +
                                  +

                                  Note

                                  +

                                  Avoid running Docker containers as root.

                                  +
                                  +

                                  The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                                  +

                                  If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                                  +
                                  +

                                  Note

                                  +

                                  If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                                  +
                                  +

                                  For example if your Prometheus data directory is /prom-data and you are using centos user

                                  +
                                  ls -la /|grep prom-data
                                  +
                                  +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                                  +
                                  +sudo chown -R centos:centos /prom-data
                                  +
                                  +ls -la /|grep prom-data
                                  +
                                  +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                                  +
                                  +
                                  +
                                  +
                                  +

                                  No Data Points

                                  +

                                  No data points on all data charts.

                                  +
                                  +

                                  Solution

                                  +

                                  If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                                  +
                                    +
                                  1. Login to the Prometheus console:

                                  2. +
                                  3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                                  4. +
                                  5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                                  6. +
                                  +
                                  +
                                    +
                                  • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                                  • +
                                  • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                                  • +
                                  • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                                  • +
                                  +
                                  +

                                  For example:

                                  +
                                  ./start-all.sh -v 3.1
                                  +
                                  +
                                  +

                                  More on start-all.sh options.

                                  +
                                  +
                                  +
                                  +

                                  Grafana Chart Shows Error (!) Sign

                                  +

                                  Run this procedure on the Scylla Monitoring Stack server.

                                  +

                                  If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                                  +
                                  +

                                  Solution

                                  +

                                  On the Scylla Monitoring Stack server:

                                  +
                                    +
                                  1. Check Prometheus is running using docker ps.

                                  2. +
                                  +
                                    +
                                  • If it is not running check the prometheus.yml for errors.

                                  • +
                                  +

                                  For example:

                                  +
                                  CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                                  +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                                  +
                                  +
                                  +
                                    +
                                  • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                                  • +
                                  +
                                  +
                                  +
                                  +

                                  Grafana Shows Server Level Metrics, but not Scylla Metrics

                                  +

                                  Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                                  +
                                  +

                                  Solution

                                  +
                                    +
                                  • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                                  • +
                                  +

                                  For example

                                  +
                                  curl 172.17.0.2:9180/metrics
                                  +
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Grafana Shows Scylla Metrics, but not Server Level Metrics

                                  +

                                  Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                                  +
                                  +

                                  Solution

                                  +

                                  1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                                  +
                                    +
                                  1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                                  2. +
                                  +
                                  +
                                  +

                                  Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                                  +

                                  While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                                  +

                                  If the node_exporter service is not starting it may need to be updated manually.

                                  +

                                  Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                                  +
                                  +
                                  +
                                  +

                                  Latencies Graphs Are empty

                                  +

                                  Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                                  +

                                  During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                                  +

                                  Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                                  +

                                  If only the latency graphs are missing, it is because of missing recording rules.

                                  +

                                  This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                                  +

                                  If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                                  +
                                  +
                                  +

                                  Reducing the total number of metrics

                                  +

                                  In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                                  +
                                  +

                                  Remove interrupts from node_exporter

                                  +

                                  By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                                  +
                                  +
                                  +
                                  +

                                  Working with Wireshark

                                  +

                                  No metrics shown in the Scylla Monitoring Stack.

                                  +
                                    +
                                  1. Install wireshark

                                  2. +
                                  +

                                  2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                                  +

                                  For example:

                                  +
                                  tshark -i eth0 -f "dst port 9180"
                                  +
                                  +
                                  +

                                  Capture from Scylla node towards Scylla Monitoring Stack server.

                                  +

                                  In this example, Scylla is running.

                                  +
                                  Monitor ip        Scylla node ip
                                  +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                                  +
                                  +
                                  +

                                  In this example, Scylla is not running

                                  +
                                  Monitor ip        Scylla node ip
                                  +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                                  +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/upgrade/index.html b/branch-4.7/upgrade/index.html new file mode 100644 index 000000000..662c3f49d --- /dev/null +++ b/branch-4.7/upgrade/index.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Scylla Monitoring Stack

                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.7/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..2d72d47c7 --- /dev/null +++ b/branch-4.7/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,800 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                                  +

                                  Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                                  +
                                  +

                                  Upgrade Procedure

                                  +
                                  +

                                  1. Upgrade to the latest 1.x version

                                  +

                                  Before starting the upgrade procedure, make sure you are running the latest 1.x version

                                  +
                                  +
                                  +

                                  2. Install the new monitoring stack

                                  +
                                    +
                                  1. Download the 2.x version from the release page.

                                  2. +
                                  3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                                  4. +
                                  5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                                    +
                                      +
                                    • scylla_servers.yml

                                    • +
                                    • scylla_manager_servers.yml

                                    • +
                                    • node_exporter_servers.yml

                                    • +
                                    +
                                  6. +
                                  7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                                  8. +
                                  +
                                  ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                                  +
                                  +

                                  While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                                  +
                                  ./kill-all.sh -g 3001 -p 9091 -m 9094
                                  +
                                  +
                                  +
                                  +

                                  Validation

                                  +

                                  Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                                  +
                                  +
                                  +
                                  +

                                  3. Alerting Rules

                                  +

                                  Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                                  +
                                  +
                                  +

                                  4. Moving to Prometheus 2.x

                                  +

                                  Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                                  +

                                  Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                                  +
                                  +

                                  a. Set the old system

                                  +

                                  The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                                  +
                                    +
                                  • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                                  • +
                                  • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                                  • +
                                  +
                                  +

                                  Note

                                  +

                                  After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                                  +
                                  +
                                  +
                                  +

                                  b. Set the new system

                                  +

                                  The following step will allow the new monitoring system to read historical metrics from the old system.

                                  +
                                    +
                                  • In the Prometheus prometheus.yml.template file add the following at the end:

                                  • +
                                  +
                                  remote_read:
                                  +  - url: "http://{ip}:9111/api/v1/read"
                                  +
                                  +
                                  +

                                  Where {ip} is the ip of the old system.

                                  +
                                    +
                                  • restart the new stack

                                  • +
                                  +
                                  +
                                  +
                                  +

                                  Validate the upgrade

                                  +

                                  You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                                  +
                                  +
                                  +
                                  +

                                  Rollback

                                  +

                                  In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.7/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..15d8c249f --- /dev/null +++ b/branch-4.7/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                                  +
                                  +

                                  Upgrade Procedure

                                  +

                                  We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                  +

                                  Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                  +
                                  +

                                  Install 2.y (The new version)

                                  +
                                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                                  +unzip scylla-monitoring-2.y.zip
                                  +cd scylla-monitoring-scylla-monitoring-2.y/
                                  +
                                  +
                                  +

                                  Replace “y” with the new minor release number, for example, 2.1.zip

                                  +
                                  +
                                  +

                                  Setting the server’s files

                                  +

                                  Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                                  +
                                  cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                                  +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Validate the new version is running the correct version

                                  +

                                  Starting from Scylla-Monitoring version 2.2, you can run:

                                  +
                                  ./start-all.sh --version
                                  +
                                  +
                                  +

                                  To validate the Scylla-Monitoring version.

                                  +
                                  +
                                  +

                                  Validate the version installed correctly

                                  +

                                  To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                                  +
                                  ./start-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  Browse to http://{ip}:9091 +And check the Grafana dashboard

                                  +

                                  Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: do not use the local dir flag when testing!

                                  +
                                  +

                                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: Do not kill the 2.x version that is currently running.

                                  +
                                  +

                                  Use the following command to kill the containers:

                                  +
                                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  You can start and stop the new 2.y version while testing.

                                  +
                                  +
                                  +

                                  Move to version 2.y (the new version)

                                  +

                                  Note: migrating will cause a few seconds of blackout in the system.

                                  +

                                  We assume that you are using external volume to store the metrics data.

                                  +
                                  +

                                  Kill all containers

                                  +

                                  Follow the instruction on how to kill the 2.y version when in testing mode.

                                  +

                                  To kill the 2.x version containers, run:

                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +

                                  Start version 2.y in normal mode

                                  +

                                  From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                                  +
                                  ./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +

                                  Point your browser to http://{ip}:3000 and see that the data is there.

                                  +
                                  +
                                  +
                                  +

                                  Rollback to version 2.x

                                  +

                                  To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                                  +

                                  To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                                  +
                                  ./kill-all.sh
                                  +cd /path/to/scylla-grafana-2.x/
                                  +./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +
                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.7/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..2e5e77a32 --- /dev/null +++ b/branch-4.7/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,758 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                                  +

                                  Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                                  +
                                  +

                                  Upgrade Procedure

                                  +
                                  +

                                  1. Validate node_exporter version

                                  +

                                  Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                                  +

                                  If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                                  +
                                  +
                                  +

                                  2. Install the new monitoring stack

                                  +
                                    +
                                  1. Download the 3.x version from the release page.

                                  2. +
                                  3. Unzip it into a different directory.

                                  4. +
                                  5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                                    +
                                      +
                                    • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                                    • +
                                    • scylla_manager_servers.yml

                                    • +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                                    +
                                    +
                                    +
                                  6. +
                                  7. Stop the old monitoring stack

                                    +
                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +
                                    +
                                  8. +
                                  9. Start the new monitoring stack

                                    +
                                    +
                                    ./start-all.sh -d /prometheus-data-path
                                    +
                                    +
                                    +
                                    +
                                  10. +
                                  +
                                  +
                                  +

                                  Validate the upgrade

                                  +

                                  You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                                  +

                                  Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                                  +
                                  +
                                  +
                                  +

                                  Rollback

                                  +

                                  To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.7/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..6cd07ac3a --- /dev/null +++ b/branch-4.7/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,802 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                                  +
                                  +

                                  Upgrade Procedure

                                  +

                                  We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                  +

                                  Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                  +
                                  +

                                  Install 3.y (The new version)

                                  +
                                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                                  +unzip scylla-monitoring-3.y.zip
                                  +cd scylla-monitoring-scylla-monitoring-3.y/
                                  +
                                  +
                                  +

                                  Replace “y” with the new minor release number, for example, 3.0.1.zip

                                  +
                                  +
                                  +

                                  Setting the server’s files

                                  +

                                  Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                  +
                                  cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                  +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Validate the new version is running the correct version

                                  +

                                  Starting from Scylla-Monitoring version 2.2, you can run:

                                  +
                                  ./start-all.sh --version
                                  +
                                  +
                                  +

                                  To validate the Scylla-Monitoring version.

                                  +
                                  +
                                  +

                                  Validate the version installed correctly

                                  +

                                  To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                                  +
                                  ./start-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  Browse to http://{ip}:9091 +And check the Grafana dashboard

                                  +

                                  Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: do not use the local dir flag when testing!

                                  +
                                  +

                                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: Do not kill the 3.x version that is currently running.

                                  +
                                  +
                                  +
                                  +

                                  Killing the new 3.y Monitoring stack in testing mode

                                  +

                                  Use the following command to kill the containers:

                                  +
                                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  You can start and stop the new 3.y version while testing.

                                  +
                                  +
                                  +

                                  Move to version 3.y (the new version)

                                  +

                                  Note: migrating will cause a few seconds of blackout in the system.

                                  +

                                  We assume that you are using external volume to store the metrics data.

                                  +
                                  +

                                  Kill all containers

                                  +

                                  At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                  +

                                  Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                                  +

                                  kill the older 3.x version containers by running:

                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +

                                  Start version 3.y in normal mode

                                  +

                                  From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                                  +
                                  ./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +

                                  Point your browser to http://{ip}:3000 and see that the data is there.

                                  +
                                  +
                                  +
                                  +

                                  Rollback to version 3.x

                                  +

                                  To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                  +

                                  To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                                  +
                                  ./kill-all.sh
                                  +cd /path/to/scylla-grafana-3.x/
                                  +./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +
                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.7/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..864386c10 --- /dev/null +++ b/branch-4.7/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,945 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                                  +
                                  +

                                  Upgrade Procedure

                                  +

                                  We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                                  +

                                  Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                                  +
                                  +

                                  Install 4.y (The new version)

                                  +
                                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                                  +unzip scylla-monitoring-4.y.zip
                                  +cd scylla-monitoring-scylla-monitoring-4.y/
                                  +
                                  +
                                  +

                                  Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                                  +
                                  +
                                  +

                                  Setting the server’s files

                                  +

                                  Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                  +
                                  cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                  +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Validate the new version is running the correct version

                                  +

                                  run:

                                  +
                                  ./start-all.sh --version
                                  +
                                  +
                                  +

                                  To validate the Scylla-Monitoring version.

                                  +
                                  +
                                  +
                                  +

                                  Running in test mode

                                  +

                                  This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                                  +
                                  +

                                  Running second monitoring stack

                                  +

                                  We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                                  +
                                  ./start-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  Browse to http://{ip}:9091 and check the Grafana dashboard.

                                  +

                                  Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: do not use the local dir flag when testing!

                                  +
                                  +

                                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: Do not kill the 3.x version that is currently running!

                                  +
                                  +
                                  +
                                  +

                                  Killing the new 4.y Monitoring stack in testing mode

                                  +

                                  Use the following command to kill the containers:

                                  +
                                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  You can start and stop the new 4.y version while testing.

                                  +
                                  +
                                  +
                                  +

                                  Migrating

                                  +
                                  +

                                  Move to version 4.y (the new version)

                                  +

                                  Note: migrating will cause a few seconds of blackout in the system.

                                  +

                                  We assume that you are using external volume to store the metrics data.

                                  +
                                  +

                                  Backup

                                  +

                                  We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                                  +
                                  +
                                  +

                                  Kill all containers

                                  +

                                  At this point you have two monitoring stacks installed with the older version running.

                                  +

                                  If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                                  +

                                  kill the older 3.x version containers by running:

                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +

                                  Start version 4.y in normal mode

                                  +

                                  From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                                  +
                                  ./start-all.sh -d /path/to/copy/data/dir
                                  +
                                  +
                                  +

                                  Point your browser to http://{ip}:3000 and see that the data is there.

                                  +
                                  +
                                  +
                                  +

                                  Rollback to version 3.x

                                  +

                                  To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                  +

                                  To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                                  +
                                  ./kill-all.sh
                                  +cd /path/to/scylla-grafana-3.x/
                                  +./start-all.sh -d /path/to/original/data/dir
                                  +
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Post-installation: Metrics back-filling

                                  +

                                  Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                                  +

                                  For example, this is a recording rule that calculates the p99 write latency:

                                  +
                                  - record: wlatencyp99
                                  +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                                  +  labels:
                                  +    by: "instance,shard"
                                  +
                                  +
                                  +

                                  For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                                  +

                                  Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                                  +
                                  +
                                  +

                                  Note

                                  +

                                  If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                                  +
                                  +
                                  +
                                  +../_images/before-backfilling.png +
                                  +

                                  This is an example of missing latency graph

                                  +
                                  +
                                  +

                                  The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                                  +

                                  For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                                  +

                                  In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                                  +

                                  The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                                  +
                                  +

                                  Determine the backfilling period

                                  +

                                  When you run the backfilling process you need to determine the start time and end time.

                                  +
                                  +

                                  Determine the start time

                                  +

                                  The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                                  +

                                  If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                                  +

                                  For the rest of this example, we will assume that your retention time is 360 days.

                                  +
                                  +
                                  +

                                  Determine the end time

                                  +

                                  Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                                  +

                                  If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                                  +

                                  That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                                  +

                                  The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                                  +
                                  +
                                  +
                                  +

                                  Backfilling Process

                                  +
                                  +

                                  backup

                                  +

                                  If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                                  +

                                  To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                                  +
                                  +
                                  +

                                  Restart the monitoring stack

                                  +

                                  You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                                  +

                                  -b "--storage.tsdb.allow-overlapping-blocks"

                                  +
                                  +
                                  +

                                  Create the data files

                                  +

                                  We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                                  +

                                  The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                                  +

                                  Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                                  +
                                  docker exec -it aprom sh
                                  +cd /prometheus/data/
                                  +promtool tsdb create-blocks-from rules \
                                  +--start $start \
                                  +--end $end \
                                  +--url http://localhost:9090 \
                                  +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                                  +
                                  +
                                  +

                                  It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                                  +
                                  +
                                  +

                                  Note

                                  +

                                  Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Copy the data files

                                  +

                                  Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                                  +

                                  Copy the data files to the Prometheus directory:

                                  +
                                  cp data/* .
                                  +
                                  +
                                  +

                                  The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                                  +

                                  Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                                  +
                                  +../_images/after-backfilling.jpg +
                                  +

                                  Un example: after loading half of the data

                                  +
                                  +
                                  +
                                  +
                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/branch-4.7/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..db6a8fa11 --- /dev/null +++ b/branch-4.7/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,817 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1.

                                  +
                                  +

                                  Upgrade Procedure

                                  +

                                  We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                  +

                                  Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                  +
                                  +

                                  Install 4.y.b (The new version)

                                  +
                                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip
                                  +unzip scylla-monitoring-4.y.b.zip
                                  +cd scylla-monitoring-scylla-monitoring-4.y.b/
                                  +
                                  +
                                  +

                                  Replace “y” with the new minor release number, for example, 4.0.1.zip

                                  +
                                  +
                                  +

                                  Setting the server’s files

                                  +

                                  Copy the target files scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                  +
                                  cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/
                                  +cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/
                                  +
                                  +
                                  +
                                  +

                                  Validate the port numbers

                                  +

                                  ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent.

                                  +

                                  Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target.

                                  +
                                  +

                                  Caution

                                  +

                                  As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics.

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Validate the new version is running the correct version

                                  +

                                  Run:

                                  +
                                  ./start-all.sh --version
                                  +
                                  +
                                  +

                                  To validate the Scylla-Monitoring version.

                                  +
                                  +
                                  +

                                  Validate the version installed correctly

                                  +

                                  To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack.

                                  +
                                  ./start-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  Browse to http://{ip}:9091 +And check the Grafana dashboard

                                  +

                                  Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: do not use the local dir flag when testing!

                                  +
                                  +

                                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: Do not kill the 4.x.a version that is currently running.

                                  +
                                  +
                                  +
                                  +

                                  Killing the new 4.y.b Monitoring stack in testing mode

                                  +

                                  Use the following command to kill the containers:

                                  +
                                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  You can start and stop the new 4.y.b version while testing.

                                  +
                                  +
                                  +

                                  Move to version 4.y.b (the new version)

                                  +

                                  Note: migrating will cause a few seconds of blackout in the system.

                                  +

                                  We assume that you are using external volume to store the metrics data.

                                  +
                                  +

                                  Kill all containers

                                  +

                                  At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                  +

                                  Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y.b Monitoring stack in testing mode +in the previous section

                                  +

                                  kill the older 4.x.a version containers by running:

                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +

                                  Start version 4.y.b in normal mode

                                  +

                                  From the new root of the scylla-monitoring-scylla-monitoring-4.y.b run

                                  +
                                  ./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +

                                  Point your browser to http://{ip}:3000 and see that the data is there.

                                  +
                                  +
                                  +
                                  +

                                  Rollback to version 4.x.a

                                  +

                                  To rollback during the testing mode, follow Killing the new 4.y.b Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                  +

                                  To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run:

                                  +
                                  ./kill-all.sh
                                  +cd /path/to/scylla-grafana-4.x.a/
                                  +./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +
                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.7/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..d9bdf6d7e --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Some queries use ALLOW FILTERING

                                  +

                                  Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                                  +

                                  These kinds of queries can create a bigger load on Scylla, and should be used with care.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/cqlCLAll.html b/branch-4.7/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..5e863a8c6 --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Some queries use Consistency Level: ALL

                                  +

                                  Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                                  +

                                  Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                                  +

                                  Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/cqlCLAny.html b/branch-4.7/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..e4dfa9504 --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Some queries use Consistency Level: ANY

                                  +

                                  Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                                  +

                                  Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.7/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..98e570f0c --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Some queries are not token-aware

                                  +

                                  Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                                  +

                                  Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/cqlNonPaged.html b/branch-4.7/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..1f2ae077e --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Some SELECT queries are non-paged

                                  +

                                  By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                                  +
                                  +

                                  Blog-post Links

                                  +

                                  https://www.scylladb.com/2018/07/13/efficient-query-paging/

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.7/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..7b947a88f --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Some queries are non-prepared

                                  +

                                  Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/heavyCompaction.html b/branch-4.7/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..fc2a68be0 --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,697 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Compaction takes lots of memory and CPU

                                  +

                                  ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                                  +

                                  If this is the case, you can do one of the following:

                                  +
                                    +
                                  • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                                    +
                                    +
                                      +
                                    • In the scylla.yml configuration file: compaction_static_shares: 100

                                    • +
                                    • In the command line when starting ScyllaDB: --compaction-static-shares 100

                                    • +
                                    +
                                    +

                                    You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                                    +
                                  • +
                                  • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                                  • +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/index.html b/branch-4.7/use-monitoring/advisor/index.html new file mode 100644 index 000000000..3855c0cab --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/index.html @@ -0,0 +1,710 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Stack Advisor

                                  +
                                  +
                                  +

                                  The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                                  +
                                  +

                                  The Advisor section

                                  +
                                  +../../_images/advisor_panel.png +
                                  +

                                  The Advisor section

                                  +
                                  +
                                  +

                                  The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                                  +

                                  For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                                  +

                                  Each Advisor issue is explained in detail:

                                  + +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/nodeCLErrors.html b/branch-4.7/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..28b1d8be3 --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Some operation failed due to unsatisfied consistency level

                                  +

                                  ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                                  +

                                  For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                                  +

                                  When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/nodeIOErrors.html b/branch-4.7/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..4e1919dfe --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  I/O Errors can indicate a node with a faulty disk

                                  +

                                  I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.7/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..b634c5d4b --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Some operations failed on the replica side

                                  +

                                  ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                                  +

                                  An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.7/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..5b0badc0c --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  CQL queries are not balanced among shards

                                  +

                                  For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                                  +

                                  There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                                  +
                                  +

                                  Blog post link

                                  +

                                  https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.7/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..1b6e82088 --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  Prepared statements cache eviction

                                  +

                                  Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                                  +
                                    +
                                  • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                                  • +
                                  • The prepared statements cache might be too small for the number of prepared statements.

                                  • +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/advisor/systemOverload.html b/branch-4.7/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..42685f0f9 --- /dev/null +++ b/branch-4.7/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  System Overload

                                  +

                                  There could be multiple indications that a system is overloaded:

                                  +
                                    +
                                  • Timeouts

                                  • +
                                  • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                                  • +
                                  • CPU at 100% when no background process (like compaction or repair) runs.

                                  • +
                                  • Queues are getting filled.

                                  • +
                                  +

                                  If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/cql-optimization.html b/branch-4.7/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..d45dad0d0 --- /dev/null +++ b/branch-4.7/use-monitoring/cql-optimization.html @@ -0,0 +1,802 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + + + +
                                  +

                                  The CQL Optimization

                                  +

                                  The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                                  +
                                  +../_images/cql_optimization_master.png +
                                  +

                                  The CQL Dashboard

                                  +
                                  +
                                  +

                                  The upper part of the dashboard holds CQL related metrics.

                                  +

                                  The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                                  +
                                  +

                                  Note

                                  +

                                  Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                                  +
                                  +

                                  The following sections describe each of the dashboard’s panel

                                  +
                                  +

                                  Prepared Statements

                                  +

                                  Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                                  +

                                  Using prepared statements has the following benefits:

                                  +
                                    +
                                  • The database only needs to parse the query once

                                  • +
                                  • The driver can route the query to the right node

                                  • +
                                  • Using place-holders and values is safer and prevents CQL-Injection

                                  • +
                                  +

                                  The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                                  +

                                  The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                                  +
                                  +
                                  +

                                  Token Aware

                                  +

                                  Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                                  +

                                  Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                                  +

                                  The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                                  +

                                  The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                                  +
                                  +
                                  +

                                  Paged Queries

                                  +

                                  By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                                  +

                                  The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                                  +

                                  The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                                  +
                                  +
                                  +

                                  Reversed CQL Reads

                                  +

                                  ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                                  +

                                  We strongly recommend using use the correct ordering. +Querying with an order different than the order the CLUSTERING ORDER BY was defined is supported, but not advisable.

                                  +

                                  For example, look at the following table:

                                  +
                                  CREATE TABLE ks1.table_demo (
                                  +   category text,
                                  +   type int,
                                  +   PRIMARY KEY (category, type))
                                  +WITH CLUSTERING ORDER BY (type DESC);
                                  +
                                  +
                                  +

                                  The following query uses reverse order:

                                  +
                                  select * from ks1.table_demo where category='cat1' order by type ASC;
                                  +
                                  +
                                  +

                                  The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                                  +

                                  The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                                  +
                                  +
                                  +

                                  ALLOW FILTERING

                                  +

                                  Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                                  +

                                  These kinds of queries can create a big load on the system, and should be used with care.

                                  +

                                  The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                                  +

                                  The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                                  +

                                  The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                                  +

                                  The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                                  +

                                  The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                                  +
                                  +
                                  +

                                  Consistency Level

                                  +

                                  Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                                  +

                                  The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                                  +

                                  Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                                  +

                                  The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                                  +

                                  The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                                  +

                                  The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                                  +

                                  The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                                  +
                                  +
                                  +

                                  Cross DC

                                  +

                                  Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                                  +
                                  +
                                  +

                                  Cross DC Consistency Level

                                  +

                                  Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                                  +
                                  +
                                  +

                                  Cross DC read requests

                                  +
                                  +

                                  Note

                                  +

                                  The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                                  +
                                  +

                                  In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                                  +

                                  The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/branch-4.7/use-monitoring/index.html b/branch-4.7/use-monitoring/index.html new file mode 100644 index 000000000..5b87ea135 --- /dev/null +++ b/branch-4.7/use-monitoring/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + + + +
                                  + +
                                  + +
                                  +

                                  Using Scylla Monitoring Stack

                                  +
                                  +
                                  +

                                  There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..2556c94c9 --- /dev/null +++ b/index.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/master/.buildinfo b/master/.buildinfo new file mode 100644 index 000000000..bc0e9bd38 --- /dev/null +++ b/master/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 024abfc283ea83c30711abde0c9fa795 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/master/.doctrees/common/monitor-description.doctree b/master/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..68d2e3e42 Binary files /dev/null and b/master/.doctrees/common/monitor-description.doctree differ diff --git a/master/.doctrees/environment.pickle b/master/.doctrees/environment.pickle new file mode 100644 index 000000000..bee4a9fbb Binary files /dev/null and b/master/.doctrees/environment.pickle differ diff --git a/master/.doctrees/index.doctree b/master/.doctrees/index.doctree new file mode 100644 index 000000000..9b0cfe749 Binary files /dev/null and b/master/.doctrees/index.doctree differ diff --git a/master/.doctrees/install/docker-compose.doctree b/master/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..ffa99b705 Binary files /dev/null and b/master/.doctrees/install/docker-compose.doctree differ diff --git a/master/.doctrees/install/index.doctree b/master/.doctrees/install/index.doctree new file mode 100644 index 000000000..50c0327ae Binary files /dev/null and b/master/.doctrees/install/index.doctree differ diff --git a/master/.doctrees/install/min-prod-hw.doctree b/master/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..fb00d9de0 Binary files /dev/null and b/master/.doctrees/install/min-prod-hw.doctree differ diff --git a/master/.doctrees/install/monitor-without-docker.doctree b/master/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..744b2f06e Binary files /dev/null and b/master/.doctrees/install/monitor-without-docker.doctree differ diff --git a/master/.doctrees/install/monitoring-stack.doctree b/master/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..64ca95714 Binary files /dev/null and b/master/.doctrees/install/monitoring-stack.doctree differ diff --git a/master/.doctrees/install/start-all.doctree b/master/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..b9c419a03 Binary files /dev/null and b/master/.doctrees/install/start-all.doctree differ diff --git a/master/.doctrees/install/thanos.doctree b/master/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..1fc564d92 Binary files /dev/null and b/master/.doctrees/install/thanos.doctree differ diff --git a/master/.doctrees/intro.doctree b/master/.doctrees/intro.doctree new file mode 100644 index 000000000..6b9a2bbd4 Binary files /dev/null and b/master/.doctrees/intro.doctree differ diff --git a/master/.doctrees/procedures/alerts/alerting.doctree b/master/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..dee628691 Binary files /dev/null and b/master/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/master/.doctrees/procedures/alerts/index.doctree b/master/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..ec8c6bee0 Binary files /dev/null and b/master/.doctrees/procedures/alerts/index.doctree differ diff --git a/master/.doctrees/procedures/datadog/cloud-integration.doctree b/master/.doctrees/procedures/datadog/cloud-integration.doctree new file mode 100644 index 000000000..fd5fd2fed Binary files /dev/null and b/master/.doctrees/procedures/datadog/cloud-integration.doctree differ diff --git a/master/.doctrees/procedures/datadog/index.doctree b/master/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..9dd92c3e2 Binary files /dev/null and b/master/.doctrees/procedures/datadog/index.doctree differ diff --git a/master/.doctrees/procedures/index.doctree b/master/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..8e8b8f172 Binary files /dev/null and b/master/.doctrees/procedures/index.doctree differ diff --git a/master/.doctrees/procedures/updating-dashboard.doctree b/master/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..5a985ad1e Binary files /dev/null and b/master/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/master/.doctrees/reference/index.doctree b/master/.doctrees/reference/index.doctree new file mode 100644 index 000000000..9ac152aa0 Binary files /dev/null and b/master/.doctrees/reference/index.doctree differ diff --git a/master/.doctrees/reference/matrix.doctree b/master/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..d04114c05 Binary files /dev/null and b/master/.doctrees/reference/matrix.doctree differ diff --git a/master/.doctrees/reference/monitoring-apis.doctree b/master/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..9bd9721eb Binary files /dev/null and b/master/.doctrees/reference/monitoring-apis.doctree differ diff --git a/master/.doctrees/troubleshooting/index.doctree b/master/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..c031cb813 Binary files /dev/null and b/master/.doctrees/troubleshooting/index.doctree differ diff --git a/master/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/master/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..60a5d4c06 Binary files /dev/null and b/master/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/master/.doctrees/upgrade/index.doctree b/master/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..d37ca295c Binary files /dev/null and b/master/.doctrees/upgrade/index.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..dd6fd212f Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..ec4354f4b Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..e7ec78615 Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..190959b89 Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..798f61fb1 Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..33898bb7d Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/master/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..f4a9943fe Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/master/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..46b974959 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/master/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..1fada2f44 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/master/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..299d6fb47 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/master/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..d5e8556c0 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/master/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..bdb45678d Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/master/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..d975f93ec Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/index.doctree b/master/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..552c0b762 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/master/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..8db88d831 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/master/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..5f6502aa4 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/master/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..95665baad Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/master/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..df1458286 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/master/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..05154d88c Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/systemOverload.doctree b/master/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..e735732e8 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/master/.doctrees/use-monitoring/cql-optimization.doctree b/master/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..091e82630 Binary files /dev/null and b/master/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/master/.doctrees/use-monitoring/index.doctree b/master/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..127c8fbea Binary files /dev/null and b/master/.doctrees/use-monitoring/index.doctree differ diff --git a/master/.nojekyll b/master/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/master/404.html b/master/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/master/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                                  +

                                  404

                                  +

                                  The ScyllaDB monster ate your page!

                                  +

                                  + Home +

                                  +
                                  + + + \ No newline at end of file diff --git a/master/CNAME b/master/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/master/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/master/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/master/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..73651eed6 --- /dev/null +++ b/master/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,495 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_healthcheck_cql_status_ag + expr: sum(scylla_manager_healthcheck_cql_status) by(cluster) + labels: + by: "cluster" + status: "1" + dd: "1" + - record: scylla_manager_healthcheck_cql_status_ag + expr: count(scylla_manager_healthcheck_cql_status==0) by(cluster) + labels: + by: "cluster" + status: "0" + dd: "1" diff --git a/master/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/master/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/master/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/master/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/master/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/master/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/master/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/master/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/master/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/master/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/master/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/master/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/master/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/master/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/master/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/master/_images/1.png b/master/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/master/_images/1.png differ diff --git a/master/_images/2.png b/master/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/master/_images/2.png differ diff --git a/master/_images/3.png b/master/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/master/_images/3.png differ diff --git a/master/_images/advisor_panel.png b/master/_images/advisor_panel.png new file mode 100644 index 000000000..89b9a5950 Binary files /dev/null and b/master/_images/advisor_panel.png differ diff --git a/master/_images/after-backfilling.jpg b/master/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/master/_images/after-backfilling.jpg differ diff --git a/master/_images/alertmanager.png b/master/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/master/_images/alertmanager.png differ diff --git a/master/_images/before-backfilling.png b/master/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/master/_images/before-backfilling.png differ diff --git a/master/_images/cql_optimization_master.png b/master/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/master/_images/cql_optimization_master.png differ diff --git a/master/_images/datadog.png b/master/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/master/_images/datadog.png differ diff --git a/master/_images/grafana.png b/master/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/master/_images/grafana.png differ diff --git a/master/_images/monitor.png b/master/_images/monitor.png new file mode 100644 index 000000000..cf691ecb3 Binary files /dev/null and b/master/_images/monitor.png differ diff --git a/master/_images/monitoring_stack.png b/master/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/master/_images/monitoring_stack.png differ diff --git a/master/_images/monitoring_stack1.png b/master/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/master/_images/monitoring_stack1.png differ diff --git a/master/_sources/common/monitor-description.rst.txt b/master/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/master/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/master/_sources/index.rst.txt b/master/_sources/index.rst.txt new file mode 100644 index 000000000..3dbe94edd --- /dev/null +++ b/master/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/master/_sources/install/docker-compose.rst.txt b/master/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/master/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/master/_sources/install/index.rst.txt b/master/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/master/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/master/_sources/install/min-prod-hw.rst.txt b/master/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..6fda62cc1 --- /dev/null +++ b/master/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                                  + + + + + + + + + + + +
                                  # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                  00
                                  + +
                                  + \ No newline at end of file diff --git a/master/_sources/install/monitor-without-docker.rst.txt b/master/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..2c8071ab5 --- /dev/null +++ b/master/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,577 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                                  `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget -O scylla-monitoring.tar.gz https://github.com/scylladb/scylla-monitoring/archive/refs/tags/|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.26.0 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.26.0.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.26.0.linux-amd64/ + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.49.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.49.1/prometheus-2.49.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories + +.. code-block:: shell + + sudo mkdir -p /prometheus/data + sudo mkdir -p /etc/prometheus/prom_rules/ + sudo mkdir -p /etc/scylla.d/prometheus/ + +.. note:: To run Promethues as non-root user, you would need to give read write and execute permissions to those directories. + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + metric_relabel_configs: + - source_labels: [__name__, scheduling_group_name] + regex: '(scylla_storage_proxy_coordinator_.*_bucket;)(atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache)' + action: drop + - source_labels: [version] + regex: '(.+)' + target_label: CPU + replacement: 'cpu' + - source_labels: [version] + regex: '(.+)' + target_label: CQL + replacement: 'cql' + - source_labels: [version] + regex: '(.+)' + target_label: OS + replacement: 'os' + - source_labels: [version] + regex: '(.+)' + target_label: IO + replacement: 'io' + - source_labels: [version] + regex: '(.+)' + target_label: Errors + replacement: 'errors' + - regex: 'help|exported_instance' + action: labeldrop + - source_labels: [version] + regex: '([0-9]+\.[0-9]+)(\.?[0-9]*).*' + replacement: '$1$2' + target_label: svr + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_write_latency_summary;0.990*)' + target_label: __name__ + replacement: 'wlatencyp99' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_write_latency_summary;0.950*)' + target_label: __name__ + replacement: 'wlatencyp95' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_write_latency_summary;0.50*)' + target_label: __name__ + replacement: 'wlatencya' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_read_latency_summary;0.990*)' + target_label: __name__ + replacement: 'rlatencyp99' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_read_latency_summary;0.950*)' + target_label: __name__ + replacement: 'rlatencyp95' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_read_latency_summary;0.50*)' + target_label: __name__ + replacement: 'rlatencya' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_cas_write_latency_summary;0.950*)' + target_label: __name__ + replacement: 'caswlatencyp95' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_cas_write_latency_summary;0.990*)' + target_label: __name__ + replacement: 'caswlatencyp99' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_cas_write_latency_summary;0.50*)' + target_label: __name__ + replacement: 'caswlatencya' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_cas_read_latency_summary;0.950*)' + target_label: __name__ + replacement: 'casrlatencyp95' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_cas_read_latency_summary;0.990*)' + target_label: __name__ + replacement: 'casrlatencyp99' + - source_labels: [__name__, quantile] + regex: '(scylla_storage_proxy_coordinator_cas_read_latency_summary;0.50*)' + target_label: __name__ + replacement: 'casrlatencya' + - source_labels: [quantile] + regex: '(0\.[1-9]+)0*' + target_label: quantile + replacement: '${1}' + - source_labels: [__name__] + regex: '(.latency..?.?|cas.latency..?.?|scylla_.*_summary)' + target_label: by + replacement: 'instance,shard' + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat /etc/scylla.d/prometheus/scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + cat /etc/scylla.d/prometheus/scylla_manager_server.yml + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd prometheus-2.49.1.linux-amd64/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 10.3.3 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different, we will assume that you used yum/dnf install. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +4. Provision the Dashboards + +For example Scylla Open-source version 5.4 and Scylla manager version 2.4 + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.5.4.yaml + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + + +Edit the ``load.*`` you just copied. For example + +.. code-block:: shell + + $ cat /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml + apiVersion: 1 + + providers: + - name: 'manager_3.3' + orgId: 1 + folder: '' + type: file + disableDeletion: false + allowUiUpdates: true + updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards + options: + path: /var/lib/grafana/dashboards/manager_3.3 + + $ cat /etc/grafana/provisioning/dashboards/load.5.4.yaml + apiVersion: 1 + + providers: + - name: '5.4' + orgId: 1 + folder: '' + type: file + disableDeletion: false + allowUiUpdates: true + updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards + options: + path: /var/lib/grafana/dashboards/ver_5.4 +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configuration`_. + +.. _`grafana configuration`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/master/_sources/install/monitoring-stack.rst.txt b/master/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..5843f351a --- /dev/null +++ b/master/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,412 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                                  `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.6 + - 2.48.1 + - 10.2.2 + * - 4.5 + - 2.47.1 + - 10.1.5 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/master/_sources/install/start-all.rst.txt b/master/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..f270d092f --- /dev/null +++ b/master/_sources/install/start-all.rst.txt @@ -0,0 +1,107 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +**--compose** This is an experimental option. When set, it initiates a two-stage process. Firstly, a ``docker-compose.yml`` file is created along with an ``.env`` file. Following this, the script executes ``docker-compose up``. Please note that having docker-compose is a prerequisite. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/master/_sources/install/thanos.rst.txt b/master/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/master/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/master/_sources/intro.rst.txt b/master/_sources/intro.rst.txt new file mode 100644 index 000000000..78481f6c3 --- /dev/null +++ b/master/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/master/_sources/procedures/alerts/alerting.rst.txt b/master/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..d196123bc --- /dev/null +++ b/master/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,114 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in files placed under `prometheus/prom_rules/`. Prometheus will load any file that ends with `yml` or `yaml`. + +Each Prometheus alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "error" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **error**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alerts severity +--------------- + +Prometheus uses the following severities from low to high: **info**, **warn**, **error**, **critical**. + +The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the **error** alert for disk-full is firing, it silences the **warn** alert. + +When adding your own alerts, you can use the severities to signal the action's importance, for example **critical** would be a pager-duty, while an **error** will be an email. + +Adding Alerts +---------------- + +Add your own alerts in a separate file with a **yml** or **yaml** extension. Making it easier during upgrade. + +Modifying Alerts +---------------- + +It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/master/_sources/procedures/alerts/index.rst.txt b/master/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/master/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/master/_sources/procedures/datadog/cloud-integration.rst.txt b/master/_sources/procedures/datadog/cloud-integration.rst.txt new file mode 100644 index 000000000..320b0e847 --- /dev/null +++ b/master/_sources/procedures/datadog/cloud-integration.rst.txt @@ -0,0 +1,58 @@ +============================================= +ScyllaDB Cloud Monitoring Datadog Integration +============================================= + +To allow external server scrapping, you will need to enable the `Prometheus proxy `_. +The Datadog agent reads from the proxy, which reads from the Promethues server. + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading ScyllaDB dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +ScyllaDB Monitoring Datadog Integration Overview +================================================ +A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog. + +Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those. + +Install And configure the Datadog Agent +======================================= + +Start by installing DataDog Agent on a server with access to ScyllaDB Cloud Prometheus Proxy server, following `Installation `_ guide. +The datadog agent should run on a machine that can reach the Prometheus Proxy server. + +Once the Datadog agent is working, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. ScyllaDB metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/master/_sources/procedures/datadog/index.rst.txt b/master/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bb6f4d66 --- /dev/null +++ b/master/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,81 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, Check the cloud users `specific guide `_. + +Scylla Monitoring Datadog Integration Overview +============================================== +A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog. + +Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those. +That labeling is done in two places: recording rules and the Prometheus relabel config. + +Recording rules aggregate the metrics so that they will be reported per instance instead of per shard, and they mark the result with a label. + +Prometheus relabel config marks metrics that are reported per instance, like disk and CPU. + + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml +Download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. + +Adding more metrics to Datadog +============================== +To add a missing metric, do the following: + +For ScyllaDB metrics, add a recording rule to report an aggregated per instance of that metric. We suggest placing it in a different YAML file to simplify an upgrade. + +OS-related metrics originate from node_exporter, and Prometheus labels them during scraping. +To label a node exporter metrics, edit the prometheus/prometheus.yml.template search for the job_name: node_exporter and find the metric_relabel_configs. +You can add a metric name to the regex section. + +If you think that metric is helpful for other users, open an issue, and we'll add it. \ No newline at end of file diff --git a/master/_sources/procedures/index.rst.txt b/master/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..c55898e8b --- /dev/null +++ b/master/_sources/procedures/index.rst.txt @@ -0,0 +1,22 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Cloud Users Datadog integration + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Cloud Users Datadog integration ` +* :doc:`Datadog Integration ` +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/master/_sources/procedures/updating-dashboard.rst.txt b/master/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..5f6cd7075 --- /dev/null +++ b/master/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,300 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 3 +pyyaml + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/master/_sources/reference/index.rst.txt b/master/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/master/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/master/_sources/reference/matrix.rst.txt b/master/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..2a934441d --- /dev/null +++ b/master/_sources/reference/matrix.rst.txt @@ -0,0 +1,165 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.7 + - 5.2, 5.4, 6.0 + - 2022.1, 2022.2, 2023.1, 2024.1 + - 1.7.0 + - 3.2 + * - 4.6 + - 5.2, 5.4 + - 2021.1, 2022.1, 2022.2, 2023.1, 2024.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/master/_sources/reference/monitoring-apis.rst.txt b/master/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/master/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/master/_sources/troubleshooting/index.rst.txt b/master/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..fa1b25a10 --- /dev/null +++ b/master/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,16 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* You can ask questions and discuss the ScyllaDB Monitoring Stack in the `ScyllaDB community forum `_ and on the `Slack channel `_. \ No newline at end of file diff --git a/master/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/master/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/master/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/master/_sources/upgrade/index.rst.txt b/master/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/master/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                                  +
                                  +
                                  +
                                  Upgrade Scylla Open Source
                                  +
                                  +
                                  + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                                  +
                                  +
                                  diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..95cec1d4e --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,150 @@ +====================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b +====================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y.b (The new version) +------------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip + unzip scylla-monitoring-4.y.b.zip + cd scylla-monitoring-scylla-monitoring-4.y.b/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the target files ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the port numbers +^^^^^^^^^^^^^^^^^^^^^^^^^ +ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent. + +Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target. + +.. caution:: + + As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics. + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x.a version that is currently running. + +Killing the new 4.y.b Monitoring stack in testing mode +------------------------------------------------------ + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y.b version while testing. + +Move to version 4.y.b (the new version) +--------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y.b Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x.a version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y.b in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y.b` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x.a +------------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y.b Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x.a/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/master/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/master/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/master/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/master/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..f86568a31 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,11 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/master/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/master/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/master/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/master/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/master/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/master/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/master/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/master/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/master/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/master/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/master/_sources/use-monitoring/advisor/index.rst.txt b/master/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..06fc98c5f --- /dev/null +++ b/master/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,37 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/master/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/master/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/master/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/master/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/master/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/master/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/master/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/master/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/master/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/master/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/master/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/master/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/master/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/master/_sources/use-monitoring/advisor/systemOverload.rst.txt b/master/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..ac0b7d62f --- /dev/null +++ b/master/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Queues are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/master/_sources/use-monitoring/cql-optimization.rst.txt b/master/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..7ac8b2284 --- /dev/null +++ b/master/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,155 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +We strongly recommend using use the correct ordering. +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is supported, but not advisable. + + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/master/_sources/use-monitoring/index.rst.txt b/master/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/master/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/master/_static/basic.css b/master/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/master/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/master/_static/check-solid.svg b/master/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/master/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/master/_static/clipboard.min.js b/master/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/master/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/master/_static/copybutton.css b/master/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/master/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                                  Short

                                  + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/master/_static/copybutton.js b/master/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/master/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/master/_static/copybutton_funcs.js b/master/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/master/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/master/_static/css/main.css b/master/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/master/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/master/_static/doctools.js b/master/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/master/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/master/_static/documentation_options.js b/master/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/master/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/master/_static/file.png b/master/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/master/_static/file.png differ diff --git a/master/_static/img/banner-background.svg b/master/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/master/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/master/_static/img/favicon-228x228.png b/master/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/master/_static/img/favicon-228x228.png differ diff --git a/master/_static/img/favicon-32x32.png b/master/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/master/_static/img/favicon-32x32.png differ diff --git a/master/_static/img/favicon.ico b/master/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/master/_static/img/favicon.ico differ diff --git a/master/_static/img/icons/icon-about-team.svg b/master/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/master/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/master/_static/img/icons/icon-about-us-m.svg b/master/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/master/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-about-us.svg b/master/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/master/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-alternator.svg b/master/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/master/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-apps.svg b/master/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/master/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-architecture.svg b/master/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/master/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/master/_static/img/icons/icon-benchmarks.svg b/master/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/master/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/master/_static/img/icons/icon-blog.svg b/master/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/master/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/master/_static/img/icons/icon-careers.svg b/master/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/master/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/master/_static/img/icons/icon-chevron-left.svg b/master/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/master/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/icons/icon-chevron-right.svg b/master/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/master/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/icons/icon-circe.svg b/master/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/master/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-clock.svg b/master/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/master/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-close.svg b/master/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/master/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/master/_static/img/icons/icon-cloud-docs.svg b/master/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/master/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-cloud.svg b/master/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/master/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-comparison.svg b/master/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/master/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/master/_static/img/icons/icon-contact-us.svg b/master/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/master/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/master/_static/img/icons/icon-developers-blog.svg b/master/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/master/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/master/_static/img/icons/icon-docs.svg b/master/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/master/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/master/_static/img/icons/icon-enterprise-m.svg b/master/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/master/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/img/icons/icon-enterprise.svg b/master/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/master/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-events.svg b/master/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/master/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/master/_static/img/icons/icon-exclamation.svg b/master/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/master/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/master/_static/img/icons/icon-expand.svg b/master/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/master/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/master/_static/img/icons/icon-forum.svg b/master/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/master/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-getting-started.svg b/master/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/master/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-glossary.svg b/master/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/master/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-home.svg b/master/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/master/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-infoworld.svg b/master/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/master/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/master/_static/img/icons/icon-integrations.svg b/master/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/master/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-knowledge-base.svg b/master/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/master/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-less.svg b/master/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/master/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/master/_static/img/icons/icon-live-test.svg b/master/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/master/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/master/_static/img/icons/icon-mail-list.svg b/master/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/master/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-manager.svg b/master/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/master/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/master/_static/img/icons/icon-memory-management.svg b/master/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/master/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/master/_static/img/icons/icon-modeling.svg b/master/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/master/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-monitoring.svg b/master/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/master/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/master/_static/img/icons/icon-networking.svg b/master/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/master/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/master/_static/img/icons/icon-news.svg b/master/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/master/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/master/_static/img/icons/icon-newsletter.svg b/master/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/master/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/master/_static/img/icons/icon-nsql-guides.svg b/master/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/master/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/master/_static/img/icons/icon-open-source.svg b/master/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/master/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/master/_static/img/icons/icon-operator.svg b/master/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/master/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-overview.svg b/master/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/master/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/master/_static/img/icons/icon-partners.svg b/master/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/master/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/master/_static/img/icons/icon-plus.svg b/master/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/master/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/master/_static/img/icons/icon-pricing.svg b/master/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/master/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/master/_static/img/icons/icon-release-notes.svg b/master/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/master/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/master/_static/img/icons/icon-resource-center.svg b/master/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/master/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/master/_static/img/icons/icon-roadmap.svg b/master/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/master/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/master/_static/img/icons/icon-search.svg b/master/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/master/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/master/_static/img/icons/icon-slack.svg b/master/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/master/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-stack-overflow.svg b/master/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/master/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/master/_static/img/icons/icon-summit.svg b/master/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/master/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-support.svg b/master/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/master/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/master/_static/img/icons/icon-tech-talks.svg b/master/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/master/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/master/_static/img/icons/icon-testing.svg b/master/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/master/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/master/_static/img/icons/icon-thumbs-down.svg b/master/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/master/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-thumbs-up.svg b/master/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/master/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-tip.svg b/master/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/master/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/master/_static/img/icons/icon-training.svg b/master/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/master/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/master/_static/img/icons/icon-triangle-down.svg b/master/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/master/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/icons/icon-university.svg b/master/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/master/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/master/_static/img/icons/icon-users-blog.svg b/master/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/master/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/master/_static/img/icons/icon-warning.svg b/master/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/master/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/master/_static/img/icons/icon-webinars.svg b/master/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/master/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/master/_static/img/icons/icon-whitepapers.svg b/master/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/master/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/master/_static/img/icons/icon-workshop.svg b/master/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/master/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/logo-docs.svg b/master/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/master/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/img/logo-scylla-horizontal-RGB.svg b/master/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/master/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/img/mascots/404.jpg b/master/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/master/_static/img/mascots/404.jpg differ diff --git a/master/_static/img/mascots/scylla-3monsters.png b/master/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/master/_static/img/mascots/scylla-3monsters.png differ diff --git a/master/_static/img/mascots/scylla-advisor-crystal.png b/master/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/master/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/master/_static/img/mascots/scylla-alternator.svg b/master/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/master/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/master/_static/img/mascots/scylla-cloud.svg b/master/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/master/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/master/_static/img/mascots/scylla-computer-3-monsters.png b/master/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/master/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/master/_static/img/mascots/scylla-computer-headset.png b/master/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/master/_static/img/mascots/scylla-computer-headset.png differ diff --git a/master/_static/img/mascots/scylla-cup-number-one.png b/master/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/master/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/master/_static/img/mascots/scylla-docs.svg b/master/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/master/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/master/_static/img/mascots/scylla-drivers.svg b/master/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/master/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/master/_static/img/mascots/scylla-enterprise.svg b/master/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/master/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/master/_static/img/mascots/scylla-forklift-boxes.png b/master/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/master/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/master/_static/img/mascots/scylla-forklift-migration.png b/master/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/master/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/master/_static/img/mascots/scylla-gear.png b/master/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/master/_static/img/mascots/scylla-gear.png differ diff --git a/master/_static/img/mascots/scylla-hardhat.png b/master/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/master/_static/img/mascots/scylla-hardhat.png differ diff --git a/master/_static/img/mascots/scylla-headband.png b/master/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/master/_static/img/mascots/scylla-headband.png differ diff --git a/master/_static/img/mascots/scylla-headset.png b/master/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/master/_static/img/mascots/scylla-headset.png differ diff --git a/master/_static/img/mascots/scylla-hearts.png b/master/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/master/_static/img/mascots/scylla-hearts.png differ diff --git a/master/_static/img/mascots/scylla-looking-down.png b/master/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/master/_static/img/mascots/scylla-looking-down.png differ diff --git a/master/_static/img/mascots/scylla-looking-up.png b/master/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/master/_static/img/mascots/scylla-looking-up.png differ diff --git a/master/_static/img/mascots/scylla-magnifying-glass-fronting.png b/master/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/master/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/master/_static/img/mascots/scylla-magnifying-glass.png b/master/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/master/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/master/_static/img/mascots/scylla-manager.svg b/master/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/master/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/master/_static/img/mascots/scylla-monitor.svg b/master/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/master/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/master/_static/img/mascots/scylla-movement-fast.png b/master/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/master/_static/img/mascots/scylla-movement-fast.png differ diff --git a/master/_static/img/mascots/scylla-movement.png b/master/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/master/_static/img/mascots/scylla-movement.png differ diff --git a/master/_static/img/mascots/scylla-onpremise.png b/master/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/master/_static/img/mascots/scylla-onpremise.png differ diff --git a/master/_static/img/mascots/scylla-opensource.svg b/master/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/master/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/master/_static/img/mascots/scylla-operator.svg b/master/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/master/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/master/_static/img/mascots/scylla-plugin.png b/master/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/master/_static/img/mascots/scylla-plugin.png differ diff --git a/master/_static/img/mascots/scylla-release-mascot.png b/master/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/master/_static/img/mascots/scylla-release-mascot.png differ diff --git a/master/_static/img/mascots/scylla-repair.png b/master/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/master/_static/img/mascots/scylla-repair.png differ diff --git a/master/_static/img/mascots/scylla-server.png b/master/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/master/_static/img/mascots/scylla-server.png differ diff --git a/master/_static/img/mascots/scylla-sleeping.png b/master/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/master/_static/img/mascots/scylla-sleeping.png differ diff --git a/master/_static/img/mascots/scylla-tall-measure.png b/master/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/master/_static/img/mascots/scylla-tall-measure.png differ diff --git a/master/_static/img/mascots/scylla-university.png b/master/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/master/_static/img/mascots/scylla-university.png differ diff --git a/master/_static/img/mascots/scylla-weights.png b/master/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/master/_static/img/mascots/scylla-weights.png differ diff --git a/master/_static/img/mascots/scylla-window-cleaning.png b/master/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/master/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/master/_static/img/mascots/scylla-with-computer-2.png b/master/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/master/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/master/_static/img/mascots/scylla-with-computer.png b/master/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/master/_static/img/mascots/scylla-with-computer.png differ diff --git a/master/_static/img/mascots/scylla-with-linux.png b/master/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/master/_static/img/mascots/scylla-with-linux.png differ diff --git a/master/_static/img/mascots/scylla-writting.png b/master/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/master/_static/img/mascots/scylla-writting.png differ diff --git a/master/_static/img/menu.svg b/master/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/master/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/scylla-monitor.png b/master/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/master/_static/img/scylla-monitor.png differ diff --git a/master/_static/js/main.bundle.js b/master/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/master/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
                                • Back
                                • ',backButtonPosition:"top",wrapper:"
                                  ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                                    "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                                    ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                                    ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                                    ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                                    ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                                    "],col:[2,"","
                                    "],tr:[2,"","
                                    "],td:[3,"","
                                    "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +

                                    ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                    + + +
                                    + + + + + +
                                    + + +
                                    + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/genindex.html b/master/genindex.html new file mode 100644 index 000000000..d7c3f806a --- /dev/null +++ b/master/genindex.html @@ -0,0 +1,659 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + + + +
                                    + + + + + +
                                    + + +
                                    + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/index.html b/master/index.html new file mode 100644 index 000000000..5652aef08 --- /dev/null +++ b/master/index.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    ScyllaDB Monitoring Stack

                                    +
                                    +
                                    +

                                    ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                    +_images/monitor.png +

                                    The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                                    +
                                      +
                                    • prometheus - collects and stores metrics

                                    • +
                                    • alertmanager - handles alerts

                                    • +
                                    • grafana - dashboard server

                                    • +
                                    +

                                    Choose a topic to get started:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/install/docker-compose.html b/master/install/docker-compose.html new file mode 100644 index 000000000..5af369992 --- /dev/null +++ b/master/install/docker-compose.html @@ -0,0 +1,833 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Using Docker Compose

                                    +

                                    Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                                    +

                                    Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                                    +
                                    +

                                    Warning

                                    +

                                    docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                                    +
                                    +
                                    +

                                    Prerequisite

                                    +

                                    Make sure you have docker and docker-compose installed.

                                    +
                                    +
                                    +

                                    Setting Prometheus

                                    +

                                    The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                                    +

                                    You can use ./prometheus-config.sh to generate the file, for example:

                                    +
                                    ./prometheus-config.sh --compose
                                    +
                                    +
                                    +

                                    For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                                    +
                                    +
                                    +

                                    Setting Grafana Provisioning

                                    +

                                    Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                                    +
                                    +

                                    Grafana Data-Source file

                                    +

                                    Run the following command to update the datasource:

                                    +
                                    ./grafana-datasource.sh --compose
                                    +
                                    +
                                    +

                                    You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                                    +
                                    +
                                    +

                                    Grafana Dashboard Load file

                                    +

                                    To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                                    +
                                    ./generate-dashboards.sh -t -v 2020.1
                                    +
                                    +
                                    +

                                    This command generates the files under: grafana/provisioning/dashboards/

                                    +
                                    +
                                    +
                                    +

                                    Docker Compose file

                                    +

                                    You can use the following example as a base for your docker compose.

                                    +

                                    Pass the following to a file called docker-compose.yml

                                    +
                                    services:
                                    +  alertmanager:
                                    +    container_name: aalert
                                    +    image: prom/alertmanager:v0.26.0
                                    +    ports:
                                    +    - 9093:9093
                                    +    volumes:
                                    +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                                    +  grafana:
                                    +    container_name: agraf
                                    +    environment:
                                    +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                                    +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                                    +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                                    +    # This is where you set Grafana security
                                    +    - GF_AUTH_BASIC_ENABLED=false
                                    +    - GF_AUTH_ANONYMOUS_ENABLED=true
                                    +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                                    +    - GF_SECURITY_ADMIN_PASSWORD=admin
                                    +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                                    +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                                    +    image: grafana/grafana:10.4.1
                                    +    ports:
                                    +    - 3000:3000
                                    +    user: 1000:1000
                                    +    volumes:
                                    +    - ./grafana/build:/var/lib/grafana/dashboards
                                    +    - ./grafana/plugins:/var/lib/grafana/plugins
                                    +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                                    +    # Uncomment the following line for grafana persistency
                                    +    # - path/to/grafana/dir:/var/lib/grafana
                                    +  loki:
                                    +    command:
                                    +    - --config.file=/mnt/config/loki-config.yaml
                                    +    container_name: loki
                                    +    image: grafana/loki:2.9.5
                                    +    ports:
                                    +    - 3100:3100
                                    +    volumes:
                                    +    - ./loki/rules:/etc/loki/rules
                                    +    - ./loki/conf:/mnt/config
                                    +  promotheus:
                                    +    command:
                                    +    - --config.file=/etc/prometheus/prometheus.yml
                                    +    container_name: aprom
                                    +    image: prom/prometheus:v2.51.1
                                    +    ports:
                                    +    - 9090:9090
                                    +    volumes:
                                    +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                                    +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                                    +    # instead of the following three targets, you can place three files under one directory and mount that directory
                                    +    # If you do, uncomment the following line and delete the three lines afterwards
                                    +    #- /path/to/targets:/etc/scylla.d/prometheus/targets/
                                    +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/targets/scylla_servers.yml
                                    +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/targets/scylla_manager_servers.yml
                                    +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/targets/node_exporter_servers.yml
                                    +    
                                    +    # Uncomment the following line for prometheus persistency 
                                    +    # - path/to/data/dir:/prometheus/data
                                    +  promtail:
                                    +    command:
                                    +    - --config.file=/etc/promtail/config.yml
                                    +    container_name: promtail
                                    +    image: grafana/promtail:2.7.3
                                    +    ports:
                                    +    - 1514:1514
                                    +    - 9080:9080
                                    +    volumes:
                                    +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                                    +version: '3'
                                    +
                                    +
                                    +
                                    +

                                    Start and Stop

                                    +

                                    To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/install/index.html b/master/install/index.html new file mode 100644 index 000000000..41720c337 --- /dev/null +++ b/master/install/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Download and Install Scylla Monitoring Stack

                                    +
                                    +
                                    +

                                    Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                                    +

                                    Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/install/min-prod-hw.html b/master/install/min-prod-hw.html new file mode 100644 index 000000000..601428e82 --- /dev/null +++ b/master/install/min-prod-hw.html @@ -0,0 +1,756 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Minimal Production System Recommendations

                                    +
                                      +
                                    • CPU - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs

                                    • +
                                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                                    • +
                                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                    • +
                                    • Network - 1GbE/10GbE preferred

                                    • +
                                    +
                                    +

                                    Calculating Prometheus Minimal Disk Space requirement

                                    +

                                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                    +

                                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                    +

                                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                    +
                                    6 * 16 * 15 * 12MB ~ 16GB
                                    +
                                    +
                                    +

                                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                    +
                                    +
                                    +

                                    Calculating Prometheus Minimal Memory Space requirement

                                    +

                                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                    +

                                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                    + +
                                    + +++++++ + + + +
                                    # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                    00
                                    + +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/install/monitor-without-docker.html b/master/install/monitor-without-docker.html new file mode 100644 index 000000000..91480d3ae --- /dev/null +++ b/master/install/monitor-without-docker.html @@ -0,0 +1,1264 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Deploying Scylla Monitoring Stack Without Docker

                                    +
                                    +

                                    Introduction

                                    +

                                    The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                                    +

                                    Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                                    +

                                    Scylla Monitoring uses the following components:

                                    +
                                      +
                                    • Alertmanager

                                    • +
                                    • Grafana Loki

                                    • +
                                    • Prometheus

                                    • +
                                    • Grafana

                                    • +
                                    +

                                    The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components.

                                    +

                                    We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                                    +
                                    +
                                    +

                                    Minimal Production System Recommendations

                                    +
                                      +
                                    • CPU - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs

                                    • +
                                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                                    • +
                                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                    • +
                                    • Network - 1GbE/10GbE preferred

                                    • +
                                    +
                                    +

                                    Calculating Prometheus Minimal Disk Space requirement

                                    +

                                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                    +

                                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                    +

                                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                    +
                                    6 * 16 * 15 * 12MB ~ 16GB
                                    +
                                    +
                                    +

                                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                    +
                                    +
                                    +

                                    Calculating Prometheus Minimal Memory Space requirement

                                    +

                                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                    +

                                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                    + +
                                    + +++++++ + + + +
                                    # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                    00
                                    + +
                                    +

                                    The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                                    +
                                    +

                                    Note

                                    +

                                    Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Install Scylla Monitoring Stack

                                    +

                                    The following procedure uses a CentOS 7 based instance

                                    +
                                      +
                                    1. Download the latest Scylla Monitoring Stack release.

                                    2. +
                                    +
                                    wget -O scylla-monitoring.tar.gz https://github.com/scylladb/scylla-monitoring/archive/refs/tags/4.0.0.tar.gz
                                    +
                                    +
                                    +
                                      +
                                    1. Open the tar

                                    2. +
                                    +

                                    tar -xvf scylla-monitoring.tar.gz

                                    +
                                    +
                                    +

                                    Install Alertmanager

                                    +

                                    Tested with alertmanager 0.26.0 version

                                    +
                                      +
                                    1. Install alertmanager

                                    2. +
                                    +
                                    wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
                                    +tar -xvf alertmanager-*.linux-amd64.tar.gz
                                    +
                                    +
                                    +
                                      +
                                    1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                                    2. +
                                    +

                                    For example:

                                    +
                                    cp -p /home/centos/scylla-monitoring-4.0.0/prometheus/rule_config.yml alertmanager-0.26.0.linux-amd64/alertmanager.yml
                                    +
                                    +
                                    +
                                      +
                                    1. Start the Alertmanager

                                    2. +
                                    +

                                    For example:

                                    +
                                    cd alertmanager-0.26.0.linux-amd64/
                                    +./alertmanager
                                    +
                                    +
                                    +
                                      +
                                    1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                                    2. +
                                    +

                                    For example:

                                    +
                                    http://192.168.135.166:9093/
                                    +
                                    +
                                    +../_images/alertmanager.png +
                                    +
                                    +

                                    Install Grafana Loki

                                    +

                                    Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                                    +

                                    We recomand using Loki with containers, but you can install it locally as described in Loki installation

                                    +

                                    You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                                    +

                                    Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                                    +

                                    Loki Related files

                                    +

                                    Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                                    +
                                    mkdir -p /etc/loki/rules
                                    +mkdir -p /etc/loki/config
                                    +cp loki/rules/* /etc/loki/rules
                                    +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                                    +
                                    +
                                    +

                                    Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                                    +

                                    Promtail Related files

                                    +

                                    Promtail has a configuration file. You need to copy and modify the configuration.

                                    +
                                    mkdir -p /etc/promtail/
                                    +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                                    +
                                    +
                                    +

                                    Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                                    +
                                    +
                                    +

                                    Install Prometheus

                                    +

                                    Tested with Prometheus version 2.49.1

                                    +
                                    +

                                    Note

                                    +

                                    If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                                    +
                                    +
                                      +
                                    1. Install Prometheus

                                    2. +
                                    +
                                    wget https://github.com/prometheus/prometheus/releases/download/v2.49.1/prometheus-2.49.1.linux-amd64.tar.gz
                                    +tar -xvf prometheus-*.linux-amd64.tar.gz
                                    +
                                    +
                                    +
                                      +
                                    1. Create Data and Config directories

                                    2. +
                                    +
                                    sudo mkdir -p /prometheus/data
                                    +sudo mkdir -p /etc/prometheus/prom_rules/
                                    +sudo mkdir -p /etc/scylla.d/prometheus/
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    To run Promethues as non-root user, you would need to give read write and execute permissions to those directories.

                                    +
                                    +
                                      +
                                    1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                                    2. +
                                    +

                                    Copy prometheus/prometheus.yml.template to prometheus.yml

                                    +

                                    For example:

                                    +
                                    cp scylla-monitoring-4.0.0/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                                    +cp scylla-monitoring-4.0.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                                    +
                                    +
                                    +
                                      +
                                    1. Edit the prometheus.yml file to point to the correct static data sources.

                                    2. +
                                    +
                                    +

                                    Note

                                    +

                                    Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                                    +
                                    +
                                    vi /etc/prometheus/prometheus.yml
                                    +
                                    +
                                    +

                                    Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                                    +

                                    For example if the alertmanager will run on the same host:

                                    +
                                    alerting:
                                    +   alertmanagers:
                                    +   - static_configs:
                                    +       - targets:
                                    +           - 127.0.0.1:9093
                                    +
                                    +
                                    +

                                    Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                                    +

                                    For example the scrape config for Scylla:

                                    +
                                    global:
                                    +  scrape_interval: 5s # By default, scrape targets every 5 second.
                                    +  scrape_timeout: 4s # Timeout before trying to scape a target again
                                    +
                                    +  # Attach these labels to any time series or alerts when communicating with
                                    +  # external systems (federation, remote storage, Alertmanager).
                                    +  external_labels:
                                    +    monitor: 'scylla-monitor'
                                    +
                                    +scrape_configs:
                                    +- job_name: scylla
                                    +  honor_labels: false
                                    +  file_sd_configs:
                                    +    - files:
                                    +      - /etc/scylla.d/prometheus/scylla_servers.yml
                                    +  relabel_configs:
                                    +    - source_labels: [__address__]
                                    +      regex:  '([^:]+)'
                                    +      target_label: __address__
                                    +      replacement: '${1}:9180'
                                    +
                                    +    - source_labels: [__address__]
                                    +      regex:  '(.*):.+'
                                    +      target_label: instance
                                    +      replacement: '${1}'
                                    +  metric_relabel_configs:
                                    +    - source_labels: [__name__, scheduling_group_name]
                                    +      regex: '(scylla_storage_proxy_coordinator_.*_bucket;)(atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache)'
                                    +      action: drop
                                    +    - source_labels: [version]
                                    +      regex:  '(.+)'
                                    +      target_label: CPU
                                    +      replacement: 'cpu'
                                    +    - source_labels: [version]
                                    +      regex:  '(.+)'
                                    +      target_label: CQL
                                    +      replacement: 'cql'
                                    +    - source_labels: [version]
                                    +      regex:  '(.+)'
                                    +      target_label: OS
                                    +      replacement: 'os'
                                    +    - source_labels: [version]
                                    +      regex:  '(.+)'
                                    +      target_label: IO
                                    +      replacement: 'io'
                                    +    - source_labels: [version]
                                    +      regex:  '(.+)'
                                    +      target_label: Errors
                                    +      replacement: 'errors'
                                    +    - regex: 'help|exported_instance'
                                    +      action: labeldrop
                                    +    - source_labels: [version]
                                    +      regex: '([0-9]+\.[0-9]+)(\.?[0-9]*).*'
                                    +      replacement: '$1$2'
                                    +      target_label: svr
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_write_latency_summary;0.990*)'
                                    +      target_label: __name__
                                    +      replacement: 'wlatencyp99'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_write_latency_summary;0.950*)'
                                    +      target_label: __name__
                                    +      replacement: 'wlatencyp95'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_write_latency_summary;0.50*)'
                                    +      target_label: __name__
                                    +      replacement: 'wlatencya'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_read_latency_summary;0.990*)'
                                    +      target_label: __name__
                                    +      replacement: 'rlatencyp99'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_read_latency_summary;0.950*)'
                                    +      target_label: __name__
                                    +      replacement: 'rlatencyp95'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_read_latency_summary;0.50*)'
                                    +      target_label: __name__
                                    +      replacement: 'rlatencya'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_cas_write_latency_summary;0.950*)'
                                    +      target_label: __name__
                                    +      replacement: 'caswlatencyp95'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_cas_write_latency_summary;0.990*)'
                                    +      target_label: __name__
                                    +      replacement: 'caswlatencyp99'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_cas_write_latency_summary;0.50*)'
                                    +      target_label: __name__
                                    +      replacement: 'caswlatencya'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_cas_read_latency_summary;0.950*)'
                                    +      target_label: __name__
                                    +      replacement: 'casrlatencyp95'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_cas_read_latency_summary;0.990*)'
                                    +      target_label: __name__
                                    +      replacement: 'casrlatencyp99'
                                    +    - source_labels: [__name__, quantile]
                                    +      regex: '(scylla_storage_proxy_coordinator_cas_read_latency_summary;0.50*)'
                                    +      target_label: __name__
                                    +      replacement: 'casrlatencya'
                                    +    - source_labels: [quantile]
                                    +      regex: '(0\.[1-9]+)0*'
                                    +      target_label: quantile
                                    +      replacement: '${1}'
                                    +    - source_labels: [__name__]
                                    +      regex: '(.latency..?.?|cas.latency..?.?|scylla_.*_summary)'
                                    +      target_label: by
                                    +      replacement: 'instance,shard'
                                    +
                                    +
                                    +
                                      +
                                    1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                                    2. +
                                    +
                                    +

                                    Note

                                    +

                                    There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                                    +
                                    +

                                    An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                                    +
                                    +

                                    Note

                                    +

                                    You must have both files even if you are not using Scylla Manager

                                    +
                                    +

                                    Add the labels for the cluster and data-center

                                    +

                                    scylla_servers.yml:

                                    +

                                    For example:

                                    +
                                    cat /etc/scylla.d/prometheus/scylla_servers.yml
                                    +# List Scylla end points
                                    +
                                    +- targets:
                                    +  - 192.168.66.6
                                    +  - 192.168.66.244
                                    +  labels:
                                    +    cluster: cluster1
                                    +    dc: dc1
                                    +- targets:
                                    +    - 172.17.0.3
                                    +  labels:
                                    +    cluster: cluster1
                                    +    dc: dc2
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    See the previous note about deprecating the node_exporter_servers.yml file.

                                    +
                                    +

                                    scylla_manager_server.yml

                                    +

                                    For example:

                                    +
                                    cat /etc/scylla.d/prometheus/scylla_manager_server.yml
                                    +- targets:
                                    +  - 127.0.0.1:5090
                                    +
                                    +
                                    +
                                      +
                                    1. Start Prometheus server:

                                    2. +
                                    +

                                    For example:

                                    +
                                    cd prometheus-2.49.1.linux-amd64/
                                    +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                                    +
                                    +
                                    +

                                    Data should start accumulate on: /prometheus/data

                                    +
                                      +
                                    1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                                    2. +
                                    +

                                    For example:

                                    +
                                    http://192.168.135.166:9090/
                                    +
                                    +
                                    +../_images/1.png +

                                    Prometheus console should be visible

                                    +
                                      +
                                    1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                                    2. +
                                    +

                                    For example:

                                    +

                                    node_memory_MemFree

                                    +../_images/2.png +

                                    And

                                    +

                                    scylla_reactor_utilization

                                    +../_images/3.png +

                                    At this point Scylla is emitting the metrics and Prometheus is able to store them.

                                    +
                                    +
                                    +

                                    Install Grafana

                                    +

                                    Tested with Grafna 10.3.3

                                    +
                                      +
                                    1. Install Grafana based on the instructions here

                                    2. +
                                    +

                                    Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different, we will assume that you used yum/dnf install.

                                    +
                                      +
                                    1. Access Scylla-Grafana-monitoring directory

                                    2. +
                                    +
                                    cd scylla-monitoring-4.0.0/
                                    +
                                    +
                                    +
                                      +
                                    1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                                    2. +
                                    +
                                    sudo cp -r grafana/plugins /var/lib/grafana/
                                    +
                                    +
                                    +
                                      +
                                    1. Provision the Dashboards

                                    2. +
                                    +

                                    For example Scylla Open-source version 5.4 and Scylla manager version 2.4

                                    +
                                    sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.5.4.yaml
                                    +sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml
                                    +sudo mkdir -p /var/lib/grafana/dashboards
                                    +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                                    +
                                    +
                                    +

                                    Edit the load.* you just copied. For example

                                    +
                                    $ cat /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml
                                    +apiVersion: 1
                                    +
                                    +providers:
                                    +- name: 'manager_3.3'
                                    +  orgId: 1
                                    +  folder: ''
                                    +  type: file
                                    +  disableDeletion: false
                                    +  allowUiUpdates: true
                                    +  updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards
                                    +  options:
                                    +    path: /var/lib/grafana/dashboards/manager_3.3
                                    +
                                    +$ cat /etc/grafana/provisioning/dashboards/load.5.4.yaml
                                    +apiVersion: 1
                                    +
                                    +providers:
                                    +- name: '5.4'
                                    +  orgId: 1
                                    +  folder: ''
                                    +  type: file
                                    +  disableDeletion: false
                                    +  allowUiUpdates: true
                                    +  updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards
                                    +  options:
                                    +    path: /var/lib/grafana/dashboards/ver_5.4
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                                    +
                                    +
                                      +
                                    1. Set the data source by copy datasource.yml and edit it

                                    2. +
                                    +
                                    sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    Scylla uses a plugin to read from some system tables see the section below about using it.

                                    +
                                    +

                                    You should set the Prometheus and the alertmanager IP and port.

                                    +

                                    For example

                                    +
                                    sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                                    +apiVersion: 1
                                    +datasources:
                                    + - name: prometheus
                                    +   type: prometheus
                                    +   url: http://192.168.135.167:9090
                                    +   access: proxy
                                    +   basicAuth: false
                                    +
                                    + - name: alertmanager
                                    +   type: camptocamp-prometheus-alertmanager-datasource
                                    +   orgId: 1
                                    +   typeLogoUrl: public/img/icn-datasource.svg
                                    +   access: proxy
                                    +   url: http://192.168.135.166:9093
                                    +   password:
                                    +   user:
                                    +   database:
                                    +   basicAuth:
                                    +   isDefault:
                                    +   jsonData:
                                    +     severity_critical: '4'
                                    +     severity_high: '3'
                                    +     severity_warning: '2'
                                    +     severity_info: '1'
                                    +
                                    +
                                    +
                                      +
                                    1. Start the Grafana service

                                    2. +
                                    +

                                    For Grafana installed with yum install

                                    +

                                    sudo service grafana-server start

                                    +
                                      +
                                    1. Make sure Grafana is running

                                    2. +
                                    +

                                    Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                                    +../_images/grafana.png +
                                    +
                                    +

                                    Using Scylla Plugin with Grafana

                                    +

                                    Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                                    +

                                    Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                                    +
                                    +

                                    Setting a monitoring user

                                    +

                                    This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                                    +
                                      +
                                    • If you have not done so, enable authorization first.

                                    • +
                                    • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                                    • +
                                    • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                                    • +
                                    +
                                    +
                                    +

                                    Installing the Plugin

                                    +

                                    Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                                    +
                                    +
                                    +

                                    Configure the Plugin

                                    +

                                    Add an entry to the datasource.yml file

                                    +
                                    - name: scylla-datasource
                                    +  type: scylladb-scylla-datasource
                                    +  orgId: 1
                                    +  isDefault:
                                    +  jsonData:
                                    +  host: ''
                                    +#  secureJsonData:
                                    +#    user: 'scylla_monitoring'
                                    +#    password: 'scylla_monitoring'
                                    +
                                    +
                                    +

                                    As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                                    +
                                    +
                                    +

                                    Enable the Plugin

                                    +

                                    Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                                    +

                                    See more about it the Grafana configuration.

                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/install/monitoring-stack.html b/master/install/monitoring-stack.html new file mode 100644 index 000000000..c7ab27ab3 --- /dev/null +++ b/master/install/monitoring-stack.html @@ -0,0 +1,1119 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Install Scylla Monitoring Stack

                                    +

                                    This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                                    +

                                    The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                                    +

                                    For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                                    +
                                    +

                                    Minimal Production System Recommendations

                                    +
                                      +
                                    • CPU - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs

                                    • +
                                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                                    • +
                                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                    • +
                                    • Network - 1GbE/10GbE preferred

                                    • +
                                    +
                                    +

                                    Calculating Prometheus Minimal Disk Space requirement

                                    +

                                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                    +

                                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                    +

                                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                    +
                                    6 * 16 * 15 * 12MB ~ 16GB
                                    +
                                    +
                                    +

                                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                    +
                                    +
                                    +

                                    Calculating Prometheus Minimal Memory Space requirement

                                    +

                                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                    +

                                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                    + +
                                    + +++++++ + + + +
                                    # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                    00
                                    + +
                                    +
                                    +
                                    +
                                    +

                                    Prerequisites

                                    +
                                      +
                                    • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                                    • +
                                    • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                                    • +
                                    + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    Scylla Monitoring Stack Compatibility Matrix

                                    Scylla Monitoring Stack Version

                                    Prometheus Version

                                    Grafana Version

                                    4.6

                                    2.48.1

                                    10.2.2

                                    4.5

                                    2.47.1

                                    10.1.5

                                    4.4

                                    2.44.0

                                    9.5.2

                                    4.3

                                    2.42.0

                                    9.3.8

                                    4.2

                                    2.41.0

                                    9.3.4

                                    4.1

                                    2.38.0

                                    9.1.0

                                    4.0

                                    2.34.0

                                    8.5.2

                                    3.11

                                    2.32.0

                                    8.3.4

                                    3.10

                                    2.32.0

                                    8.3.3

                                    3.9.2

                                    2.29.1

                                    8.2.7

                                    3.9

                                    2.29.1

                                    8.1.1

                                    3.8

                                    2.27.1

                                    7.5.7

                                    3.7

                                    2.25.2

                                    7.4.0

                                    3.6

                                    2.18.1

                                    7.3.5

                                    3.5

                                    2.18.1

                                    7.1.5

                                    3.4

                                    2.18.1

                                    6.7.3

                                    +
                                    +
                                    +

                                    Docker Post Installation

                                    +

                                    Docker post installation guide can be found here

                                    +
                                    +

                                    Note

                                    +

                                    Avoid running the container as root.

                                    +
                                    +

                                    To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                                    +
                                      +
                                    1. Create the Docker group.

                                    2. +
                                    +
                                    sudo groupadd docker
                                    +
                                    +
                                    +
                                      +
                                    1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                                    2. +
                                    +
                                    sudo usermod -aG docker $USER
                                    +
                                    +
                                    +
                                      +
                                    1. Start Docker by calling:

                                    2. +
                                    +
                                    sudo systemctl enable docker
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Install Scylla Monitoring Stack

                                    +

                                    Procedure

                                    +
                                      +
                                    1. Download and extract the latest Scylla Monitoring Stack binary;.

                                    2. +
                                    +
                                    wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.0.0.tar.gz
                                    +tar -xvf scylla-monitoring-4.0.0.tar.gz
                                    +cd scylla-monitoring-scylla-monitoring-4.0.0
                                    +
                                    +
                                    +

                                    As an alternative, you can clone and use the Git repository directly.

                                    +
                                    git clone https://github.com/scylladb/scylla-monitoring.git
                                    +cd scylla-monitoring
                                    +git checkout branch-4.0
                                    +
                                    +
                                    +
                                      +
                                    1. Start Docker service if needed

                                    2. +
                                    +
                                    sudo systemctl restart docker
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Configure Scylla Monitoring Stack

                                    +

                                    To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                                    +

                                    This configuration can be done from files, or using the Consul api.

                                    +

                                    Scylla Manager 2.0 and higher supports the Consul API.

                                    +
                                    +

                                    Configure Scylla nodes from files

                                    +
                                      +
                                    1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                                    2. +
                                    +
                                    +

                                    Note

                                    +

                                    It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                                    +
                                    +

                                    For example:

                                    +
                                    - targets:
                                    +      - 172.17.0.2
                                    +      - 172.17.0.3
                                    +  labels:
                                    +      cluster: cluster1
                                    +      dc: dc1
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                                    +
                                    +

                                    Using IPV6

                                    +

                                    To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets.

                                    +

                                    For example:

                                    +
                                    - targets:
                                    +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]"
                                    +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]"
                                    +  labels:
                                    +      cluster: cluster1
                                    +      dc: dc1
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                                    +
                                    +

                                    For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                                    +
                                    +

                                    Note

                                    +

                                    By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                                    +
                                    +

                                    If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                                    +

                                    For example:

                                    +
                                    ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                                    +
                                    +
                                    +

                                    Mark the different Data Centers with Labels.

                                    +

                                    As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                                    +

                                    You can use the genconfig.py script to generate the server file. For example:

                                    +
                                    ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                                    +
                                    +
                                    +

                                    This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                                    +

                                    OR

                                    +

                                    The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                                    +
                                    nodetool status | ./genconfig.py -NS
                                    +
                                    +
                                    +

                                    2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                                    +

                                    You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                                    +

                                    For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                                    +
                                    # List Scylla Manager end points
                                    +
                                    +- targets:
                                    +  - 172.17.0.7:5090
                                    +
                                    +
                                    +

                                    Note that you do not need to add labels to the Scylla Manager targets.

                                    +
                                    +
                                    +

                                    Configure Scylla nodes using Scylla-Manager Consul API

                                    +

                                    Scylla Manager 2.0 has a Consul like API.

                                    +

                                    When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                                    +

                                    For example:

                                    +
                                    ./start-all.sh -L 10.10.0.1
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                                    +
                                    +
                                    +
                                    +

                                    Connecting Scylla-Monitoring to ScyllaDB

                                    +

                                    Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                                    +

                                    You can limit the user to read only, currently it only read table from the system keyspace.

                                    +

                                    You can set a user and password from a file or environment variables.

                                    +

                                    If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                                    +

                                    To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                                    +
                                    +

                                    Note

                                    +

                                    It is best to use a dedicated user and password with limited privileges.

                                    +
                                    +
                                    +
                                    +

                                    Use an external directory for the Prometheus data directory

                                    +

                                    The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                                    +
                                    +

                                    Note

                                    +

                                    Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                                    +
                                    +

                                    If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                                    +

                                    In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                                    +
                                    +
                                    +

                                    Add Additional Prometheus Targets

                                    +

                                    There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                                    +

                                    The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                                    +

                                    You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                                    +
                                    - job_name: 'myservice'
                                    +  # Override the global default and scrape targets from this job every 5 seconds.
                                    +  scrape_interval: 5s
                                    +  static_configs:
                                    +    - targets:
                                    +      - 17.0.0.1:7000
                                    +
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Start and Stop Scylla Monitoring Stack

                                    +
                                    +

                                    Start

                                    +
                                    ./start-all.sh -d prometheus_data
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Stop

                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Start a Specific Scylla Monitoring Stack Version

                                    +

                                    By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                                    +

                                    You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                                    +

                                    Multiple versions are supported. For example:

                                    +
                                    ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                                    +
                                    +
                                    +

                                    will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                                    +
                                    +
                                    +

                                    Accessing the localhost

                                    +

                                    The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                                    +
                                    ./start-all.sh -l -d prometheus-data
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Configure rsyslog on each Scylla node

                                    +

                                    generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                                    +

                                    Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                                    +

                                    Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                                    +

                                    If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                                    +
                                    if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                                    +
                                    +
                                    +

                                    Restart rsyslog for the configuration to take effect.

                                    +
                                    systemctl restart rsyslog
                                    +
                                    +
                                    +
                                    +
                                    +
                                    +

                                    View Grafana Dashboards

                                    +

                                    Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/install/start-all.html b/master/install/start-all.html new file mode 100644 index 000000000..fb19e06cf --- /dev/null +++ b/master/install/start-all.html @@ -0,0 +1,771 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    The start-all.sh Command

                                    +

                                    Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                                    +

                                    The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                                    +
                                    +

                                    General Options

                                    +

                                    -h Help, Print the help, and exit.

                                    +

                                    –version print the current Scylla-Monitoring stack version, and exit.

                                    +

                                    -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                                    +

                                    -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                                    +

                                    -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                                    +

                                    –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                                    +

                                    –compose This is an experimental option. When set, it initiates a two-stage process. Firstly, a docker-compose.yml file is created along with an .env file. Following this, the script executes docker-compose up. Please note that having docker-compose is a prerequisite.

                                    +
                                    + + +
                                    +

                                    Alert Manager

                                    +

                                    The Alertmanager handles the alerts and takes the following parameters:

                                    +

                                    -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                                    +

                                    -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                                    +

                                    -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/install/thanos.html b/master/install/thanos.html new file mode 100644 index 000000000..b68c6bb1f --- /dev/null +++ b/master/install/thanos.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Using Thanos as Data Source With Scylla Monitoring Stack

                                    +

                                    Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                                    +
                                      +
                                    • High-availability.

                                    • +
                                    • Horizontal scaling.

                                    • +
                                    • Backup.

                                    • +
                                    +

                                    The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                                    +

                                    The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                                    +
                                    +

                                    Using Thanos As a Prometheus Aggregator

                                    +

                                    There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                                    +
                                    +

                                    Prometheus Configuration

                                    +

                                    We will assume you have two Prometheus servers running.

                                    +
                                      +
                                    1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                                    2. +
                                    3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                                    4. +
                                    +
                                    +
                                    +

                                    Thanos sidecar

                                    +

                                    The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                                    +
                                    docker run -d \
                                    + -v /path/to/prom/dir:/data/prom:z \
                                    + -i --name sidecar thanosio/thanos \
                                    + sidecar \
                                    + --grpc-address=0.0.0.0:10911 \
                                    + --grpc-grace-period=1s \
                                    + --http-address=0.0.0.0:10912 \
                                    + --http-grace-period=1s \
                                    + --prometheus.url=http://prometheus-ip:9090 \
                                    + --tsdb.path=/data/prom \
                                    + -p 10912:10912 \
                                    + -p 10911:10911
                                    +
                                    +
                                    +

                                    After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                                    +
                                    +
                                    +

                                    Thanos query

                                    +

                                    Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                                    +
                                    docker run -d \
                                    + --name thanos -- thanosio/thanos \
                                    +   query \
                                    +   --debug.name=query0 \
                                    +   --log.level=debug \
                                    +   --grpc-address=0.0.0.0:10903 \
                                    +   --grpc-grace-period=1s \
                                    +   --http-address=0.0.0.0:10904 \
                                    +   --http-grace-period=1s \
                                    +   --query.replica-label=prometheus \
                                    +   --store={ip1}:10911 --store={ip2}:10911
                                    +
                                    +
                                    +

                                    After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                                    +
                                    +
                                    +

                                    Update Scylla Data source

                                    +

                                    The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                                    +

                                    The file you edit is a template file that replaces the file Grafana uses, next time you start.

                                    +

                                    Restart the Scylla Monitoring Stack it should now use Thanos.

                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/intro.html b/master/intro.html new file mode 100644 index 000000000..83e7b6fed --- /dev/null +++ b/master/intro.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    ScyllaDB Monitoring Stack

                                    +

                                    ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                    +_images/monitor.png +

                                    The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                                    +
                                      +
                                    • prometheus - Collects and stores metrics

                                    • +
                                    • grafan-loki - Parses logs and generates metrics and alerts

                                    • +
                                    • alertmanager - Handles alerts

                                    • +
                                    • grafana - Dashboards server

                                    • +
                                    +

                                    A few optional components are used for additional services

                                    +
                                      +
                                    • grafana-image-renderer - Allows you to download a dashboard as an image.

                                    • +
                                    • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                                    • +
                                    +
                                    +

                                    High Level Architecture

                                    +_images/monitoring_stack1.png +

                                    We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                                    +

                                    We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                                    +

                                    The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                                    +

                                    We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                                    +

                                    Choose a topic to get started:

                                    + +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/objects.inv b/master/objects.inv new file mode 100644 index 000000000..0e3f04744 Binary files /dev/null and b/master/objects.inv differ diff --git a/master/procedures/alerts/alerting.html b/master/procedures/alerts/alerting.html new file mode 100644 index 000000000..ac634f326 --- /dev/null +++ b/master/procedures/alerts/alerting.html @@ -0,0 +1,788 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Alerting

                                    +

                                    Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                                    +

                                    You can read more about Prometheus alerting here

                                    +

                                    By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                                    +

                                    In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                                    +

                                    The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                                    +../../_images/monitoring_stack.png +
                                    +

                                    Prometheus Alerts

                                    +

                                    The Prometheus alerts are defined in files placed under prometheus/prom_rules/. Prometheus will load any file that ends with yml or yaml.

                                    +

                                    Each Prometheus alert consists of:

                                    +
                                      +
                                    • Name

                                    • +
                                    • What happened

                                    • +
                                    • For how long

                                    • +
                                    • What to report

                                    • +
                                    +

                                    For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                                    +
                                    - alert: InstanceDown
                                    +  expr: up == 0
                                    +  for: 60s
                                    +  labels:
                                    +    severity: "error"
                                    +  annotations:
                                    +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                                    +    summary: Instance {{ $labels.instance }} down
                                    +
                                    +
                                    +

                                    The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                                    +

                                    The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                                    +

                                    The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to error.

                                    +

                                    annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                                    +
                                    +

                                    Alerts severity

                                    +

                                    Prometheus uses the following severities from low to high: info, warn, error, critical.

                                    +

                                    The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the error alert for disk-full is firing, it silences the warn alert.

                                    +

                                    When adding your own alerts, you can use the severities to signal the action’s importance, for example critical would be a pager-duty, while an error will be an email.

                                    +
                                    +
                                    +

                                    Adding Alerts

                                    +

                                    Add your own alerts in a separate file with a yml or yaml extension. Making it easier during upgrade.

                                    +
                                    +
                                    +

                                    Modifying Alerts

                                    +

                                    It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade.

                                    +
                                    +
                                    +
                                    +

                                    Alertmanager

                                    +

                                    The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                                    +

                                    The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                                    +
                                      +
                                    • Routes: Represent a routing tree, the most specific rule, wins

                                    • +
                                    • Inhibition: Mute an alert, based on another alert

                                    • +
                                    • Receiver: Send a notification via email, sluck, etc’

                                    • +
                                    +

                                    Check the Alertmanager documentation for details on how to specify a specific receiver.

                                    +

                                    In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                                    +
                                    +
                                    +

                                    Tips When Adding an Alert

                                    +

                                    It’s worse having an alert that does not work, than not having an alert at all

                                    +

                                    There are multiple ways you can use to make sure your alert is set correctly:

                                    +
                                      +
                                    • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                                    • +
                                    • Force the alert to be active by reducing the limits or the duration.

                                    • +
                                    • When possible simulate the actual scenario and see that the alert works as expected.

                                    • +
                                    +

                                    For example, low available disk space.

                                    +

                                    Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                                    +

                                    Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                                    +

                                    Starting with a simple working expression helps you bisect problems.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/procedures/alerts/index.html b/master/procedures/alerts/index.html new file mode 100644 index 000000000..e8afb96a7 --- /dev/null +++ b/master/procedures/alerts/index.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Stack Alert Manager

                                    +
                                    +
                                    +

                                    Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/procedures/datadog/cloud-integration.html b/master/procedures/datadog/cloud-integration.html new file mode 100644 index 000000000..2d9080a47 --- /dev/null +++ b/master/procedures/datadog/cloud-integration.html @@ -0,0 +1,751 @@ + + + + + + + + + + + + + ScyllaDB Cloud Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    ScyllaDB Cloud Monitoring Datadog Integration

                                    +

                                    To allow external server scrapping, you will need to enable the Prometheus proxy. +The Datadog agent reads from the proxy, which reads from the Promethues server.

                                    +
                                      +
                                    1. Installing and configuring the Datadog Agent.

                                    2. +
                                    3. Add Datadog recording rules.

                                    4. +
                                    5. Loading ScyllaDB dashboard to Datadog.

                                    6. +
                                    7. Optionally load Monitor (Alerts).

                                    8. +
                                    +
                                    +

                                    ScyllaDB Monitoring Datadog Integration Overview

                                    +

                                    A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog.

                                    +

                                    Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those.

                                    +
                                    +
                                    +

                                    Install And configure the Datadog Agent

                                    +

                                    Start by installing DataDog Agent on a server with access to ScyllaDB Cloud Prometheus Proxy server, following Installation guide. +The datadog agent should run on a machine that can reach the Prometheus Proxy server.

                                    +

                                    Once the Datadog agent is working, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                    +

                                    Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                                    +
                                    +

                                    Post configuration

                                    +

                                    Restart the agent based on your installation. ScyllaDB metrics should be visible in Datadog.

                                    +
                                    +

                                    Note

                                    +

                                    By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Upload the Dashboard

                                    +

                                    Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                                    +
                                    +
                                    +

                                    Using the Dashboard

                                    +

                                    We created a Datadog dashboard that resembles the Grafana dashboards.

                                    +../../_images/datadog.png +

                                    The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                                    +
                                    +

                                    Note

                                    +

                                    Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                                    +
                                    +
                                    +
                                    +

                                    Adding Monitor

                                    +

                                    Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/procedures/datadog/index.html b/master/procedures/datadog/index.html new file mode 100644 index 000000000..508508b9f --- /dev/null +++ b/master/procedures/datadog/index.html @@ -0,0 +1,772 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Datadog Integration

                                    +

                                    The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                                    +
                                      +
                                    1. Installing and configuring the Datadog Agent.

                                    2. +
                                    3. Add Datadog recording rules.

                                    4. +
                                    5. Loading Scylla dashboard to Datadog.

                                    6. +
                                    7. Optionally load Monitor (Alerts).

                                    8. +
                                    +
                                    +

                                    Note

                                    +

                                    Scylla Cloud users, Check the cloud users specific guide.

                                    +
                                    +
                                    +

                                    Scylla Monitoring Datadog Integration Overview

                                    +

                                    A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog.

                                    +

                                    Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those. +That labeling is done in two places: recording rules and the Prometheus relabel config.

                                    +

                                    Recording rules aggregate the metrics so that they will be reported per instance instead of per shard, and they mark the result with a label.

                                    +

                                    Prometheus relabel config marks metrics that are reported per instance, like disk and CPU.

                                    +
                                    +
                                    +

                                    Install And configure the Datadog Agent

                                    +

                                    Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                                    +

                                    Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml +Download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                                    +
                                    +

                                    Post configuration

                                    +

                                    Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                                    +
                                    +

                                    Note

                                    +

                                    By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Add datadog recording rules

                                    +

                                    Download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                                    +
                                    +
                                    +

                                    Upload the Dashboard

                                    +

                                    Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                                    +
                                    +
                                    +

                                    Using the Dashboard

                                    +

                                    We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                                    +../../_images/datadog.png +

                                    The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                                    +
                                    +

                                    Note

                                    +

                                    Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                                    +
                                    +
                                    +
                                    +

                                    Adding Monitor

                                    +

                                    Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                                    +
                                    +
                                    +

                                    Adding more metrics to Datadog

                                    +

                                    To add a missing metric, do the following:

                                    +

                                    For ScyllaDB metrics, add a recording rule to report an aggregated per instance of that metric. We suggest placing it in a different YAML file to simplify an upgrade.

                                    +

                                    OS-related metrics originate from node_exporter, and Prometheus labels them during scraping. +To label a node exporter metrics, edit the prometheus/prometheus.yml.template search for the job_name: node_exporter and find the metric_relabel_configs. +You can add a metric name to the regex section.

                                    +

                                    If you think that metric is helpful for other users, open an issue, and we’ll add it.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/procedures/index.html b/master/procedures/index.html new file mode 100644 index 000000000..7f6291685 --- /dev/null +++ b/master/procedures/index.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    ScyllaDB Monitoring Stack Procedures

                                    +
                                    +
                                    +

                                    There are several reference guides available which give additional information. Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/procedures/updating-dashboard.html b/master/procedures/updating-dashboard.html new file mode 100644 index 000000000..bdf0a94f8 --- /dev/null +++ b/master/procedures/updating-dashboard.html @@ -0,0 +1,976 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Adding and Modifying Dashboards

                                    +

                                    This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                                    +

                                    It covers dashboard templates and how to modify them.

                                    + +
                                    +

                                    General Limitations

                                    +

                                    Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                                    +
                                    +

                                    Consistency Between Restarts

                                    +

                                    By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                                    +
                                    +
                                    +

                                    Consistency Between Upgrades

                                    +

                                    As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                                    +
                                    +

                                    Note

                                    +

                                     You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                                    +
                                    +

                                    At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                                    +
                                    +
                                    +
                                    +

                                    Using Templated Dashboards

                                    +

                                    Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                                    +

                                    Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                                    +

                                    For example a typical graph panel would look like this:

                                    +
                                    {
                                    +    "aliasColors": {},
                                    +    "bars": false,
                                    +    "datasource": "prometheus",
                                    +    "editable": true,
                                    +    "error": false,
                                    +    "fill": 0,
                                    +    "grid": {
                                    +        "threshold1": null,
                                    +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                                    +        "threshold2": null,
                                    +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                                    +    },
                                    +    "gridPos": {
                                    +        "h": 6,
                                    +        "w": 10,
                                    +        "x": 0,
                                    +        "y": 4
                                    +    },
                                    +    "id": 2,
                                    +    "isNew": true,
                                    +    "legend": {
                                    +        "avg": false,
                                    +        "current": false,
                                    +        "max": false,
                                    +        "min": false,
                                    +        "show": false,
                                    +        "total": false,
                                    +        "values": false
                                    +    },
                                    +    "lines": true,
                                    +    "linewidth": 2,
                                    +    "links": [],
                                    +    "nullPointMode": "connected",
                                    +    "percentage": false,
                                    +    "pointradius": 5,
                                    +    "points": false,
                                    +    "renderer": "flot",
                                    +    "seriesOverrides": [
                                    +        {}
                                    +    ],
                                    +    "span": 5,
                                    +    "stack": false,
                                    +    "steppedLine": false,
                                    +    "targets": [
                                    +        {
                                    +            "expr": "sum(node_filesystem_avail) by (instance)",
                                    +            "intervalFactor": 1,
                                    +            "legendFormat": "",
                                    +            "refId": "A",
                                    +            "step": 1
                                    +        }
                                    +    ],
                                    +    "timeFrom": null,
                                    +    "timeShift": null,
                                    +    "title": "Available Disk Size",
                                    +    "tooltip": {
                                    +        "msResolution": false,
                                    +        "shared": true,
                                    +        "sort": 0,
                                    +        "value_type": "cumulative"
                                    +    },
                                    +    "transparent": false,
                                    +    "type": "graph",
                                    +    "xaxis": {
                                    +        "show": true
                                    +    },
                                    +    "yaxes": [
                                    +        {
                                    +            "format": "percent",
                                    +            "logBase": 1,
                                    +            "max": 101,
                                    +            "min": 0,
                                    +            "show": true
                                    +        },
                                    +        {
                                    +            "format": "short",
                                    +            "logBase": 1,
                                    +            "max": null,
                                    +            "min": null,
                                    +            "show": true
                                    +        }
                                    +    ]
                                    +}
                                    +
                                    +
                                    +

                                    As you can imagine, most panels would have similar values.

                                    +

                                    To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                                    +
                                    +

                                    The Template Class System

                                    +

                                    The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                                    +

                                    The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                                    +

                                    In the template file, you can also add or override attributes.

                                    +

                                    The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                                    +

                                    When generating dashboards, each class will be replaced by its definition.

                                    +

                                    For example, a row in the type.json is defined as:

                                    +
                                    {
                                    + "base_row": {
                                    +     "collapse": false,
                                    +     "editable": true
                                    + },
                                    + "row": {
                                    +     "class": "base_row",
                                    +     "height": "250px"
                                    + }
                                    + }
                                    +
                                    +
                                    +

                                    Will be used like in a template:

                                    +
                                    {
                                    +     "class": "row",
                                    +     "height": "150px",
                                    +     "panels": [
                                    +     ]
                                    +}
                                    +
                                    +
                                    +

                                    And the output will be:

                                    +
                                    {
                                    +     "class": "row",
                                    +     "collapse": false,
                                    +     "editable": true,
                                    +     "height": "150px",
                                    +     "panels": [
                                    +
                                    +     ]
                                    +}
                                    +
                                    +
                                    +

                                    We can see that the template added the panels attribute and that it overrides the height attribute.

                                    +
                                    +
                                    +

                                    Panel Example

                                    +

                                    Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                                    +
                                    {
                                    +     "class": "row",
                                    +     "panels": [
                                    +         {
                                    +             "class": "bytes_panel",
                                    +             "span": 3,
                                    +             "targets": [
                                    +                 {
                                    +                     "expr": "sum(node_filesystem_avail) by (instance)",
                                    +                     "intervalFactor": 1,
                                    +                     "legendFormat": "",
                                    +                     "metric": "",
                                    +                     "refId": "A",
                                    +                     "step": 1
                                    +                 }
                                    +             ],
                                    +             "title": "Available Disk Size"
                                    +         }
                                    +     ]
                                    +}
                                    +
                                    +
                                    +

                                    In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                                    +

                                    You can also see that the span attribute is overridden to set the panel size.

                                    +

                                    To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                                    +
                                    +
                                    +

                                    Grafana Formats and Layouts

                                    +

                                    The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                                    +

                                    Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                                    +

                                    The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                                    +

                                    To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                                    +

                                    The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                                    +

                                    You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                                    +

                                    gridPos has the following attributes:

                                    +
                                    {
                                    +   "x": 0,
                                    +   "y": 0,
                                    +   "w": 24,
                                    +   "h": 4
                                    + }
                                    +
                                    +
                                    +

                                    When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                                    +
                                    {
                                    +   "gridPos": {
                                    +      "h": 2
                                    +    }
                                    +}
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Generating the dashboards from templates (generate-dashboards.sh)

                                    +
                                    +

                                    Prerequisite

                                    +

                                    Python 3 +pyyaml

                                    +

                                    make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                                    +

                                    Use the -h flag to get help information.

                                    +

                                    You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                                    +

                                    When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                                    +

                                    For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                                    +

                                    .\generate-dashboards.sh -v 2020.1

                                    +
                                    +

                                    Note

                                    +

                                    generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Validation

                                    +

                                    After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                                    +

                                    Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/reference/index.html b/master/reference/index.html new file mode 100644 index 000000000..7f2bd7a86 --- /dev/null +++ b/master/reference/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Stack Reference Guide

                                    +
                                    +
                                    +

                                    There are several reference guides available which give additional information. Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/reference/matrix.html b/master/reference/matrix.html new file mode 100644 index 000000000..a043bc8f9 --- /dev/null +++ b/master/reference/matrix.html @@ -0,0 +1,877 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Stack Support Matrix

                                    +

                                    The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                                    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                                    Scylla Monitoring Stack Version

                                    Scylla Open Source Version

                                    Scylla Enterprise Version

                                    Node_exporter[1] Version

                                    Scylla Manager Version

                                    4.7

                                    5.2, 5.4, 6.0

                                    2022.1, 2022.2, 2023.1, 2024.1

                                    1.7.0

                                    3.2

                                    4.6

                                    5.2, 5.4

                                    2021.1, 2022.1, 2022.2, 2023.1, 2024.1

                                    1.4.1

                                    3.0, 3.1, 3.2

                                    4.5

                                    5.0,5.1,5.2,5.4

                                    2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                    1.4.1

                                    3.0, 3.1, 3.2

                                    4.4.5

                                    5.0,5.1,5.2,5.4

                                    2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                    1.4.1

                                    3.0, 3.1, 3.2

                                    4.4

                                    5.0,5.1,5.2

                                    2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                    1.4.1

                                    3.0, 3.1

                                    4.3

                                    5.0,5.1,5.2

                                    2020.1, 2021.1, 2022.1, 2022.2

                                    1.4.1

                                    2.5, 2.6, 3.0

                                    4.2

                                    4.5,4.6,5.0,5.1

                                    2020.1, 2021.1, 2022.1, 2022.2

                                    1.4.1

                                    2.5, 2.6, 3.0

                                    4.1

                                    4.5,4.6,5.0,5.1

                                    2020.1, 2021.1, 2022.1, 2022.2

                                    0.17

                                    2.5, 2.6, 3.0

                                    4.0

                                    4.3, 4.4, 4.5, 4.6, 5.0

                                    2020.1, 2021.1, 2022.1

                                    0.17

                                    2.3, 2.4, 2.5, 2.6, 3.0

                                    3.11

                                    4.3, 4.4, 4.5, 4.6, 5.0

                                    2020.1, 2021.1, 2022.2

                                    0.17

                                    2.3, 2.4, 2.5, 2.6

                                    3.10

                                    4.3, 4.4, 4.5, 4.6

                                    2020.1, 2021.1

                                    0.17

                                    2.3, 2.4, 2.5, 2.6

                                    3.9

                                    4.3, 4.4, 4.5, 4.6

                                    2020.1, 2021.1

                                    0.17

                                    2.3, 2.4, 2.5

                                    3.8

                                    4.3, 4.4, 4.5

                                    2020.1, 2021.1

                                    0.17

                                    2.3, 2.4, 2.5

                                    3.7

                                    4.2, 4.3, 4.4

                                    2019.1, 2020.1, 2021.1

                                    0.17

                                    2.2, 2.3

                                    3.6.3

                                    4.2, 4.3, 4.4

                                    2019.1, 2020.1, 2021.1

                                    0.17

                                    2.2, 2.3, 2.1

                                    3.6

                                    4.1, 4.2, 4.3

                                    2019.1, 2020.1

                                    0.17

                                    2.1, 2.2, 2.3

                                    3.6.1

                                    4.1, 4.2, 4.3

                                    2019.1, 2020.1

                                    0.17

                                    2.1, 2.2

                                    3.6.1

                                    4.1, 4.2, 4.3, 4.4

                                    2019.1, 2020.1

                                    0.17

                                    2.1, 2.2

                                    3.5

                                    3.3, 4.0, 4.1, 4.2

                                    2019.1, 2020.1

                                    0.17

                                    2.0, 2.1, 2.2

                                    3.4.3

                                    3.3, 4.0, 4.1, 4.2

                                    2019.1, 2020.1

                                    0.17

                                    2.0, 2.1

                                    3.4

                                    3.3, 4.0, 4.1

                                    2018.1, 2019.1

                                    0.17

                                    2.0, 2.1

                                    3.3

                                    3.1, 3.2, 3.3, 4.0

                                    2018.1, 2019.1

                                    0.17

                                    1.4, 2.0, 2.1

                                    3.2

                                    3.1, 3.2, 3.3

                                    2018.1, 2019.1

                                    0.17

                                    1.4, 2.0

                                    3.1

                                    2.3, 3.0, 3.1, 3.2

                                    2018.1, 2019.1

                                    0.17

                                    1.3, 1.4, 2.0

                                    3.0

                                    2.3, 3.0, 3.1, 3.2

                                    2018.1, 2019.1

                                    0.17

                                    1.3, 1.4

                                    2.4

                                    2.3, 3.0, 3.1

                                    2018.1, 2019.1

                                    0.14, 0.17

                                    1.3, 1.4

                                    2.3

                                    2.3, 3.0

                                    2018.1, 2019.1

                                    0.14, 0.17

                                    1.3

                                    2.2

                                    2.3, 3.0

                                    2018.1, 2019.1

                                    0.14, 0.17

                                    1.3

                                    2.1

                                    2.3, 3.0

                                    2018.1

                                    0.14, 0.17

                                    1.3

                                    +

                                    [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/reference/monitoring-apis.html b/master/reference/monitoring-apis.html new file mode 100644 index 000000000..55313e8ec --- /dev/null +++ b/master/reference/monitoring-apis.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Stack Interfaces

                                    +

                                    Scylla exposes two interfaces for online monitoring, as described below

                                    +
                                    +

                                    Prometheus API

                                    +

                                    By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                                    +

                                    For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                                    +

                                    You can change the Prometheus listening address and port in scylla.yaml file

                                    +
                                    # prometheus port
                                    +# By default, Scylla opens prometheus API port on port 9180
                                    +# setting the port to 0 will disable the prometheus API.
                                    +prometheus_port: 9180
                                    +#
                                    +# prometheus address
                                    +# By default, Scylla binds all interfaces to the prometheus API
                                    +# It is possible to restrict the listening address to a specific one
                                    +prometheus_address: 0.0.0.0
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/robots.txt b/master/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/master/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/master/search.html b/master/search.html new file mode 100644 index 000000000..c912f00e6 --- /dev/null +++ b/master/search.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + + + +
                                    + + + + + +
                                    + + +
                                    + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/searchindex.js b/master/searchindex.js new file mode 100644 index 000000000..1f5c0312e --- /dev/null +++ b/master/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/cloud-integration", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/cloud-integration.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "ScyllaDB Cloud Monitoring Datadog Integration", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "scylla": [0, 1, 2, 4, 7, 9, 10, 12, 14, 15, 27, 28, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "monitor": [0, 2, 4, 7, 10, 15, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "stack": [0, 2, 4, 7, 10, 12, 13, 15, 23, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "scylladb": [0, 2, 4, 5, 13, 19, 20, 22, 23, 24, 25, 26, 31, 32, 34, 36, 38, 39, 42], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 20, 22, 24, 28, 29, 30, 31, 34, 35, 36, 38, 40, 41, 42], "full": [0, 1, 3, 6, 9, 10, 28], "alert": [0, 1, 3, 5, 6, 9, 12, 13, 14], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 17, 20, 22, 24, 36, 38, 40], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 13, 15, 22, 31, 34, 40, 42], "open": [0, 1, 3, 5, 6, 9, 13, 17, 18, 21, 26], "sourc": [0, 1, 3, 5, 6, 9, 10, 17, 21, 22, 40], "tool": [0, 1, 3, 9, 20, 42], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 13, 15, 17, 20, 23, 24, 25, 26, 27, 42], "grafana": [0, 1, 3, 8, 9, 10, 12, 13, 23, 25, 26, 27], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 14, 17, 20, 23, 24, 25, 26, 27, 35, 42, 43], "consist": [1, 9, 10, 13, 22, 35], "three": [1, 2, 6, 10, 26], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 20, 22, 26], "collect": [1, 5, 6, 7, 8, 9, 20, 24, 26, 36, 38], "store": [1, 5, 8, 9, 15, 23, 25, 26, 27, 29, 30, 40], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 15, 17, 22, 23, 24, 25, 27, 42], "alertmanag": [1, 2, 7, 9, 23, 25, 26, 27], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 18, 22, 28, 42], "choos": [1, 3, 9, 11, 12, 13, 14, 16, 19, 20, 43], "topic": [1, 3, 9, 11, 14, 16, 19, 43], "get": [1, 6, 8, 9, 10, 15, 26, 29, 39, 40, 41, 42], "start": [1, 3, 5, 8, 9, 10, 12, 13, 15, 22, 23, 24, 25, 27, 34], "user": [1, 2, 6, 7, 9, 13, 14, 28, 42], "guid": [1, 6, 9, 12, 13, 14, 20, 21], "download": [1, 5, 6, 9, 12, 13, 22, 23, 24, 25, 26, 27], "instal": [1, 2, 9, 20], "procedur": [1, 5, 6, 9, 20, 21], "troubleshoot": [1, 9], "refer": [1, 6, 9, 14], "upgrad": [1, 10, 13, 14], "lesson": [1, 9, 29, 30, 31], "univers": [1, 9], "github": [1, 5, 6, 23, 25, 26, 27], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 13, 15, 26, 28, 42], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 23, 24, 25, 26, 27, 31, 33, 34, 41, 42, 43], "can": [2, 5, 6, 7, 8, 10, 12, 13, 15, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 31, 34, 35, 42, 43], "all": [2, 3, 5, 6, 8, 10, 12, 13, 15, 18, 20, 22, 24, 28, 32, 35, 42], "sh": [2, 3, 6, 20, 22, 23, 24, 25, 26, 27], "kill": [2, 6, 20, 22, 24], "script": [2, 3, 6, 7, 15, 24], "an": [2, 4, 5, 7, 8, 9, 13, 15, 20, 22, 24, 26, 33, 35, 36, 38, 40, 42], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 15, 18, 22, 26], "requir": [2, 8, 29, 32, 36, 42], "more": [2, 4, 5, 6, 10, 15, 18, 20, 28, 31, 34, 36, 39, 42], "manual": [2, 20], "step": [2, 8, 15, 20, 22, 23, 24, 25, 26, 27], "onc": [2, 12, 13, 22, 26, 33, 40, 42], "configur": [2, 7, 10, 15, 18, 20, 22, 34, 35], "simplifi": [2, 13], "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 22, 23, 24, 25, 26, 27, 34, 35, 36, 37, 40, 41, 42, 43], "two": [2, 6, 7, 8, 13, 15, 18, 22, 25, 26, 27, 40, 42], "wai": [2, 5, 7, 10, 13, 20, 26, 42], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 13, 15, 20, 22, 24, 25, 26, 27, 28, 29, 32, 33, 39, 42], "one": [2, 6, 7, 18, 20, 22, 23, 24, 25, 26, 27, 29, 31, 32, 34, 36, 42], "both": [2, 5, 6, 13, 20, 23, 25, 26, 27, 42], "In": [2, 6, 10, 15, 20, 22, 26, 34, 42], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 13, 15, 20, 28, 40, 42], "updat": [2, 5, 10, 15, 20, 22], "yml": [2, 5, 6, 7, 8, 10, 13, 20, 22, 23, 24, 25, 26, 27, 34, 42], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 13, 15, 20, 22, 23, 25, 26, 27, 30, 34, 36, 41, 42], "make": [2, 5, 6, 7, 8, 10, 15, 20, 22, 23, 24, 25, 26, 27, 42], "sure": [2, 5, 6, 8, 10, 15, 20, 22, 23, 24, 25, 26, 27, 42], "have": [2, 4, 5, 6, 7, 8, 10, 15, 20, 25, 26, 27], "among": [2, 35], "other": [2, 8, 9, 10, 13], "ip": [2, 5, 6, 7, 8, 13, 18, 20, 22, 23, 25, 26, 27], "address": [2, 5, 6, 7, 8, 13, 18, 20, 22], "either": [2, 6], "locat": [2, 7, 10, 22, 24, 35], "scylla_serv": [2, 5, 6, 20, 22, 23, 24, 25, 26, 27, 42], "consul": [2, 7], "manag": [2, 5, 14, 17, 19, 27], "config": [2, 5, 7, 13], "gener": [2, 5, 6, 9, 10, 12, 13, 42], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 13, 20, 22, 23, 24, 25, 26, 27, 35, 36, 42], "For": [2, 4, 5, 6, 7, 10, 12, 13, 15, 18, 20, 22, 26, 35, 36, 39, 42], "product": [2, 7], "system": [2, 7, 9, 10, 11, 20, 23, 25, 26, 27, 29, 34, 35, 42], "advis": [2, 35, 42], "extern": [2, 5, 7, 8, 10, 12, 15, 20, 23, 25, 26, 27, 42], "directori": [2, 5, 7, 8, 10, 15, 22, 23, 24, 25, 26, 27], "databas": [2, 5, 7, 22, 31, 42], "accordingli": [2, 12, 13], "see": [2, 4, 5, 6, 10, 12, 13, 15, 18, 20, 22, 23, 24, 25, 26, 27, 34, 42], "below": [2, 5, 6, 10, 15, 18, 20], "read": [2, 5, 6, 8, 9, 10, 12, 20, 22, 27, 28, 32, 34], "its": [2, 5, 6, 7, 8, 9, 15, 22], "from": [2, 5, 7, 8, 9, 10, 12, 13, 22, 23, 24, 25, 26, 27, 28, 37, 42], "note": [2, 5, 6, 7, 20, 22, 23, 25, 26, 27], "latter": 2, "tell": 2, "where": [2, 5, 6, 15, 20, 22, 26, 42], "themselv": [2, 15], "which": [2, 8, 12, 14, 15, 16, 17, 20, 34, 36, 38, 40, 42], "differ": [2, 5, 6, 7, 8, 10, 13, 15, 22, 23, 24, 25, 26, 27, 33, 42], "run": [2, 3, 5, 6, 7, 8, 9, 12, 13, 15, 17, 20, 22, 24, 34, 41], "follow": [2, 4, 5, 6, 7, 10, 12, 13, 15, 17, 20, 22, 23, 25, 26, 27, 34, 42], "command": [2, 6, 8, 20, 22, 23, 25, 26, 27, 34], "datasourc": [2, 5, 6, 8, 15], "under": [2, 5, 6, 10, 13, 26], "yaml": [2, 5, 10, 12, 13, 18], "To": [2, 4, 5, 6, 12, 13, 15, 18, 22, 23, 24, 25, 26, 27], "sashboard": 2, "t": [2, 15, 26], "line": [2, 5, 6, 7, 8, 15, 22, 26, 34], "flag": [2, 6, 7, 8, 15, 20, 22, 23, 25, 26, 27], "v": [2, 6, 7, 8, 15, 20], "specifi": [2, 6, 7, 10, 15, 20, 22, 27, 34], "version": [2, 5, 7, 15, 17, 20], "enterpris": [2, 6, 15, 17], "2020": [2, 6, 15, 17], "1": [2, 5, 6, 7, 8, 12, 13, 15, 17, 21, 23, 25, 26, 27], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 13, 15, 20, 22, 23, 24, 25, 26, 27, 28, 29, 32, 34, 37, 41, 42], "your": [2, 5, 6, 7, 8, 10, 11, 12, 13, 15, 18, 20, 22, 23, 25, 26, 27, 29, 30, 31, 42], "pass": [2, 6, 7, 22], "call": [2, 6, 7, 12, 13], "servic": [2, 5, 6, 7, 9, 20], "container_nam": 2, "aalert": 2, "imag": [2, 9, 20], "prom": [2, 8, 20], "v0": [2, 5], "26": [2, 5], "port": [2, 5, 6, 7, 18, 20, 22, 23, 25, 26], "9093": [2, 5], "volum": [2, 4, 5, 6, 23, 25, 26, 27], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 13, 15, 20, 26], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 15, 24, 34], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 15], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 15, 20, 23, 25, 26, 27], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 26, 35], "json": [2, 12, 13, 15], "10": [2, 5, 6, 10, 15, 17], "3000": [2, 5, 6, 23, 25, 26, 27], "1000": [2, 34], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 15, 30, 36, 38, 42], "path": [2, 5, 6, 7, 8, 10, 22, 23, 24, 25, 26, 27], "dir": [2, 7, 8, 23, 25, 26, 27], "loki": [2, 6, 9], "mnt": 2, "2": [2, 5, 6, 12, 13, 15, 17, 21, 25, 36], "9": [2, 5, 6, 17, 26], "5": [2, 5, 6, 15, 17, 20, 27], "3100": [2, 5], "rule": [2, 5, 7, 10, 12, 20, 26, 33, 41], "conf": [2, 5, 6, 12, 13], "promotheu": 2, "aprom": [2, 20, 26], "v2": [2, 5], "51": [2, 20], "9090": [2, 5, 8, 20, 26], "prom_rul": [2, 5, 10, 13, 26], "instead": [2, 5, 6, 8, 12, 13, 20, 26, 42], "target": [2, 5, 7, 15, 18, 20, 22, 24, 27], "place": [2, 6, 7, 8, 10, 13, 15, 42], "mount": 2, "If": [2, 5, 6, 7, 8, 12, 13, 15, 20, 22, 24, 26, 27, 34, 37, 39, 40, 41, 42], "do": [2, 5, 6, 7, 13, 15, 20, 22, 23, 24, 25, 26, 27, 31, 34, 42], "delet": 2, "afterward": 2, "d": [2, 5, 6, 7, 8, 12, 13, 22, 23, 24, 25, 26, 27], "scylla_manager_serv": [2, 5, 6, 20, 22, 24, 25, 26, 27], "node_exporter_serv": [2, 5, 6, 22, 23], "promtail": [2, 5], "7": [2, 5, 6, 17], "3": [2, 4, 5, 6, 15, 17, 21, 36], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 4, 5, 6, 7, 10, 20, 22, 26, 42], "down": [2, 10, 20, 22, 23, 25, 26, 27, 29, 34, 36], "begin": [3, 11, 14, 16, 19, 43], "deploi": [3, 6], "without": [3, 6, 7, 15, 20, 22, 26, 27], "us": [3, 4, 7, 9, 10, 11, 20, 22, 23, 24, 25, 26, 27, 31, 35, 36, 38, 40, 42], "compos": [3, 7], "thano": [3, 9], "cpu": [4, 5, 6, 13, 41], "cluster": [4, 5, 6, 12, 13, 20, 26, 42], "100": [4, 5, 6, 26, 34, 41], "core": [4, 5, 6, 20, 26], "2vcpu": [4, 5, 6], "larger": [4, 5, 6, 15], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 12, 13, 23, 25, 26, 34, 36, 40], "storag": [4, 5, 6, 7, 9, 15, 26], "retent": [4, 5, 6, 22, 26], "period": [4, 5, 6, 8, 10, 20, 22, 34, 40], "section": [4, 5, 6, 10, 12, 13, 20, 22, 25, 26, 27, 42], "network": [4, 5, 6, 7, 20], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 20], "perform": [4, 5, 6, 20, 26, 34, 35, 39, 42], "block": [4, 5, 6, 26], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 26, 31, 35, 36, 38, 42], "default": [4, 5, 6, 7, 10, 12, 13, 15, 18, 20, 22, 24, 26, 27, 32, 42], "15": [4, 5, 6, 22, 26], "dai": [4, 5, 6, 7, 22, 26], "around": [4, 5, 6, 20], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 13, 20, 42], "assum": [4, 5, 6, 7, 8, 10, 23, 25, 26, 27], "scrape": [4, 5, 6, 13], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 39], "6": [4, 5, 6, 15, 17], "node": [4, 5, 7, 12, 13, 17, 20, 22, 29, 30, 31, 35, 36, 38, 39, 42], "each": [4, 5, 7, 8, 9, 10, 15, 17, 20, 27, 29, 31, 35, 40, 42], "16": [4, 5, 6, 20], "so": [4, 5, 6, 7, 8, 10, 13, 15, 20, 22, 26, 31, 42], "total": [4, 5, 6, 8, 15, 26], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 22, 24, 33, 40, 42], "need": [4, 5, 6, 7, 8, 10, 12, 13, 15, 20, 26, 29, 30, 31, 41, 42], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 13, 15, 20, 37, 41, 42], "replac": [4, 5, 6, 8, 12, 13, 15, 23, 25, 26, 27], "ad": [4, 5, 6, 7, 14], "we": [4, 5, 6, 8, 9, 12, 13, 15, 23, 25, 26, 27, 42], "alloc": [4, 5, 6], "least": [4, 5, 6, 26], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 15, 20, 22, 26, 29, 34, 42], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 15, 20, 40, 42], "fast": [4, 5, 6, 41], "enough": [4, 5, 6, 41], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 15, 20, 22, 26, 29, 35, 42], "out": [4, 5, 6, 8, 10, 41], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 35, 36, 38], "over": [4, 5, 6, 26], "longer": [4, 5, 6, 15, 22, 24, 26], "durat": [4, 5, 6, 7, 10, 26], "e": [4, 5, 6, 15, 26], "g": [4, 5, 6, 7, 22, 23, 25, 26, 27], "look": [4, 5, 6, 8, 10, 12, 13, 15, 26, 42], "week": [4, 5, 6, 7, 26], "view": [4, 5, 12, 13], "would": [4, 5, 6, 8, 10, 15, 22, 26, 28, 31, 42], "take": [4, 5, 6, 7, 15, 20, 22, 26], "than": [4, 5, 6, 10, 15, 22, 26, 42], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 26, 35], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 20, 24, 36], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 12, 15, 18, 22, 27, 42], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 23, 25, 26, 27], "help": [5, 7, 10, 13, 15, 42], "pleas": [5, 7, 20], "most": [5, 10, 15, 26, 37, 42], "common": [5, 7, 10, 42], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 10, 20], "standalon": [5, 20], "thei": [5, 6, 7, 10, 13, 15, 39, 40], "alreadi": [5, 23, 25, 26, 27], "consolid": 5, "suggest": [5, 13, 15, 26], "those": [5, 12, 13, 26, 27], "offici": 5, "document": [5, 6, 8, 10, 15, 20, 22, 23, 24, 25, 26, 27], "also": [5, 6, 7, 8, 10, 15], "main": [5, 22, 40], "item": 5, "avail": [5, 6, 8, 10, 13, 14, 15, 16, 29, 42], "data": [5, 7, 9, 10, 12, 13, 15, 22, 23, 24, 25, 27, 28, 29, 30, 31, 35, 36, 38, 39, 41, 42], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 20], "befor": [5, 6, 10, 22, 23, 24, 25, 26, 27, 29, 30, 36, 42], "support": [5, 6, 15, 16, 28, 42], "want": [5, 6, 10, 23, 25, 26, 27], "latest": [5, 6, 7, 23, 25, 26, 27], "releas": [5, 22, 23, 24, 25, 26, 27], "tightli": 5, "compat": [5, 15, 20, 22, 24], "matrix": [5, 16], "cento": [5, 20], "instanc": [5, 6, 10, 12, 13, 15, 26], "wget": [5, 6, 23, 25, 26, 27], "o": [5, 7, 13, 17, 24, 27, 35], "tar": [5, 6, 23, 25, 26, 27], "gz": [5, 6], "http": [5, 6, 8, 20, 22, 23, 25, 26, 27, 31, 32, 39], "com": [5, 6, 23, 25, 26, 27, 31, 32, 39], "archiv": [5, 6, 23, 25, 26, 27], "ref": 5, "tag": 5, "xvf": [5, 6], "test": [5, 20, 23, 42], "linux": 5, "amd64": 5, "copi": [5, 20, 22, 23, 24, 25, 27], "file": [5, 7, 8, 10, 12, 13, 15, 18, 22, 24, 34], "cp": [5, 23, 24, 25, 26, 27], "p": [5, 7, 8, 20, 22, 23, 25, 26, 27], "cd": [5, 6, 23, 25, 26, 27], "verifi": [5, 10, 24], "point": [5, 6, 15, 23, 25, 26, 27], "browser": [5, 6, 8, 15, 20, 23, 25, 26, 27], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 20, 26], "aggreg": [5, 12, 13], "inspir": 5, "central": [5, 9], "check": [5, 10, 13, 20, 23, 25, 26, 27, 37, 38, 42], "recomand": 5, "local": [5, 6, 7, 8, 9, 15, 20, 23, 25, 26, 27, 42], "describ": [5, 6, 8, 18, 20, 42], "respons": [5, 10], "pars": [5, 9, 15, 33, 42], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 36, 38], "load": [5, 6, 10, 12, 13, 20, 26, 28, 31, 32, 42], "multipl": [5, 6, 7, 8, 9, 10, 15, 29, 32, 33, 39, 41, 42], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 13, 20, 22, 23, 25, 27], "relat": [5, 13, 42], "modifi": [5, 14], "mkdir": 5, "templat": [5, 6, 8, 13, 20, 22, 42], "edit": [5, 6, 7, 8, 12, 13, 15, 20], "localhost": [5, 7, 26], "loki_ip": 5, "": [5, 6, 7, 9, 10, 15, 28, 29, 37, 40, 42], "49": 5, "besid": [5, 7, 22, 42], "expect": [5, 10, 23, 25, 26, 27], "scrap": [5, 7, 12, 13], "job": [5, 6, 20], "onli": [5, 6, 7, 12, 13, 20, 22, 24, 26, 31, 33, 34, 40, 42], "import": [5, 6, 7, 10, 12, 13, 22, 23, 25, 26, 27, 34], "record": [5, 7, 12, 20, 26], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 13, 15, 22, 23, 25, 26, 27], "sudo": [5, 6, 20], "promethu": [5, 12, 26], "non": [5, 20, 22, 30, 31, 35, 39, 42], "root": [5, 6, 20, 23, 25, 26, 27], "give": [5, 14, 16], "write": [5, 26, 30], "execut": [5, 7, 28, 33], "permiss": [5, 6, 22], "correct": [5, 24, 42], "static": [5, 34], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 22, 27], "host": [5, 6, 7, 9, 20, 27], "static_config": [5, 6], "127": [5, 7, 20], "right": [5, 6, 15, 42], "typic": [5, 12, 13, 15, 26, 29, 31, 40, 42], "node_export": [5, 6, 7, 9, 13, 17, 27], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 12, 13, 15, 18, 20, 22, 24, 32, 42], "everi": [5, 6, 7, 26], "scrape_timeout": 5, "timeout": [5, 41], "try": [5, 20], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 12, 13, 26], "ani": [5, 6, 10, 15, 20, 35, 42], "seri": [5, 8], "commun": [5, 19], "feder": 5, "remot": 5, "external_label": [5, 22], "scrape_config": [5, 22], "job_nam": [5, 6, 13], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": [5, 13], "target_label": 5, "9180": [5, 18, 20], "metric_relabel_config": [5, 13], "__name__": 5, "scheduling_group_nam": [5, 26], "scylla_storage_proxy_coordinator_": 5, "_bucket": 5, "atexit": 5, "gossip": 5, "mem_compact": 5, "memtabl": 5, "stream": 5, "background_reclaim": 5, "compact": [5, 26, 41], "memtable_to_cach": 5, "action": [5, 10], "drop": [5, 7, 41, 42], "cql": [5, 6, 9, 35, 43], "io": 5, "error": [5, 10, 15, 26, 35, 36, 38], "exported_inst": 5, "labeldrop": 5, "svr": 5, "quantil": 5, "scylla_storage_proxy_coordinator_write_latency_summari": 5, "990": 5, "wlatencyp99": [5, 26], "950": 5, "wlatencyp95": 5, "50": [5, 34], "wlatencya": 5, "scylla_storage_proxy_coordinator_read_latency_summari": 5, "rlatencyp99": 5, "rlatencyp95": 5, "rlatencya": 5, "scylla_storage_proxy_coordinator_cas_write_latency_summari": 5, "caswlatencyp95": 5, "caswlatencyp99": 5, "caswlatencya": 5, "scylla_storage_proxy_coordinator_cas_read_latency_summari": 5, "casrlatencyp95": 5, "casrlatencyp99": 5, "casrlatencya": 5, "latenc": [5, 26, 31, 34, 42], "ca": [5, 7], "scylla_": 5, "_summari": 5, "shard": [5, 12, 13, 20, 26, 35], "There": [5, 6, 8, 10, 14, 15, 16, 26, 39, 41, 43], "found": [5, 6, 7, 10, 15], "must": [5, 6, 12, 36], "even": [5, 6, 7, 12, 13, 20], "center": [5, 6, 8, 42], "cat": 5, "list": [5, 6], "end": [5, 6, 10, 22, 42], "66": [5, 20], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 13, 26], "dc1": [5, 6], "172": [5, 6, 20], "17": [5, 6, 17, 20, 24], "dc2": [5, 6], "previou": [5, 25, 26, 27], "deprec": 5, "5090": [5, 6, 20], "tsdb": [5, 7, 8, 26], "accumul": 5, "consol": [5, 20], "visibl": [5, 12, 13], "through": 5, "node_memory_memfre": 5, "And": [5, 15, 23, 25, 27], "scylla_reactor_util": 5, "At": [5, 15, 25, 26, 27], "emit": 5, "abl": [5, 8, 22, 24, 26], "them": [5, 7, 9, 10, 13, 15, 24, 35], "grafna": 5, "here": [5, 6, 7, 10, 22], "depend": [5, 8, 26], "repositori": [5, 6], "yum": 5, "zip": [5, 23, 25, 26, 27], "structur": 5, "dnf": 5, "access": [5, 7, 12], "r": [5, 7, 15, 20], "provis": [5, 15], "manager_3": 5, "just": [5, 15], "apivers": 5, "name": [5, 6, 8, 10, 13, 20, 24, 42], "orgid": 5, "folder": 5, "type": [5, 15, 42], "disabledelet": 5, "allowuiupd": 5, "updateintervalsecond": 5, "how": [5, 7, 8, 10, 15, 23, 25, 26, 27, 29, 30, 31, 35, 42], "often": 5, "scan": [5, 28], "chang": [5, 7, 15, 18, 20, 22, 23, 24, 25, 26, 27], "option": [5, 6, 8, 9, 12, 13, 20, 22, 26, 34], "ver_5": 5, "A": [5, 7, 8, 9, 12, 13, 15, 29, 30, 36, 40, 42], "otherwis": 5, "some": [5, 8, 10, 12, 13, 20, 26, 35, 39], "tabl": [5, 6, 10, 17, 28, 35, 42], "url": [5, 8, 22, 26], "167": 5, "proxi": [5, 12], "basicauth": 5, "camptocamp": 5, "typelogourl": 5, "public": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "assumpt": 5, "colloc": 5, "connect": [5, 8, 15, 18, 20], "between": [5, 8, 12, 13, 20, 22, 23, 25, 26, 27, 34, 42], "strongli": [5, 42], "encourag": 5, "restrict": [5, 18], "keyspac": [5, 6], "part": [5, 6, 10, 24, 28, 31, 42], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 15, 22], "detail": [5, 10, 34, 35], "done": [5, 6, 7, 13, 15, 20, 26], "first": [5, 12, 13, 23, 25, 26, 27, 42], "new": [5, 6, 12, 13, 20, 40], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 42], "AND": 5, "login": [5, 6, 20], "proper": [5, 20], "select": [5, 35, 42], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 15, 27, 33, 34], "mention": [5, 15], "previous": [5, 25, 26, 27], "safer": [5, 42], "dedic": [5, 6], "limit": [5, 6, 8, 10, 32, 34, 42], "privileg": [5, 6, 7, 26], "un": [5, 26], "comment": 5, "relev": [5, 7, 26, 35], "usernam": 5, "unsign": 5, "ini": 5, "allow_loading_unsigned_plugin": 5, "setup": 6, "pull": [6, 20], "evalu": [6, 7, 26], "laptop": 6, "48": 6, "47": 6, "44": 6, "42": 6, "8": [6, 17, 20, 22, 26], "41": 6, "38": 6, "34": 6, "11": [6, 17], "32": 6, "29": 6, "27": [6, 15], "25": [6, 20], "18": 6, "avoid": [6, 15, 20, 32, 42], "go": [6, 12, 13, 20], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 10, 23, 25, 26, 27], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 13, 20, 22], "extract": 6, "binari": [6, 20], "clone": 6, "git": 6, "directli": [6, 9, 13], "checkout": 6, "restart": [6, 7, 8, 12, 13, 22], "know": [6, 20, 31, 42], "higher": [6, 10, 26, 31, 42], "wish": [6, 7], "match": [6, 42], "datacent": 6, "nodetool": 6, "statu": [6, 20, 26], "valid": 6, "ipv6": 6, "insid": [6, 7, 15, 20], "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 22], "listen": [6, 7, 18, 22], "set": [6, 7, 10, 15, 18, 34], "inform": [6, 7, 14, 15, 16, 18, 26, 28, 29, 30], "agent": [6, 7, 8, 9, 17, 20, 27], "machin": [6, 7, 12, 13, 20, 24], "overrid": [6, 7, 15], "n": [6, 7, 27], "my_scylla_serv": 6, "prometheus_data": 6, "mark": [6, 12, 13], "seen": 6, "genconfig": 6, "py": [6, 15], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 20, 23, 25, 26, 27], "within": [6, 10, 15], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 39], "outsid": [6, 7, 22], "result": [6, 7, 13, 22, 29, 31, 32, 34, 40, 42], "lost": [6, 7, 15, 42], "exist": [6, 10, 15, 42], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 34, 42], "firewal": [6, 20], "7000": [6, 20], "myservic": 6, "m": [6, 7, 22, 23, 25, 26, 27], "2019": [6, 17, 39], "reach": [6, 8, 12, 13, 31, 34, 36, 42], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 31, 32, 36, 38, 42], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 15, 20], "authent": [6, 7], "disabl": [6, 18, 20], "simplest": 7, "small": [7, 12, 13, 40], "util": [7, 15, 24, 26], "appropri": 7, "h": [7, 15], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 13, 26, 36, 41], "map": 7, "bind": [7, 18], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 12, 22, 26, 30, 33, 35], "addit": [7, 8, 9, 10, 14, 16, 26, 42], "specif": [7, 10, 12, 13, 18, 20, 37, 42], "driver": [7, 31, 32, 39, 42], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 20, 41], "experiment": 7, "initi": 7, "stage": 7, "process": [7, 22, 34, 41], "firstli": 7, "along": 7, "env": 7, "prerequisit": 7, "gui": [7, 15, 20], "keep": [7, 22, 26], "clear": 7, "comma": 7, "separ": [7, 10], "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 13, 15, 26], "mean": [7, 15, 22, 28, 29, 30, 31, 32, 36, 38, 42], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 15], "b": [7, 26], "disk": [7, 10, 13, 15, 20, 28, 30, 35], "possibl": [7, 10, 18, 42], "api": [7, 8, 22], "resolv": 7, "explicitli": [7, 15], "optim": [7, 33, 39, 43], "while": [7, 10, 20, 22, 23, 25, 26, 27, 34], "cdc": 7, "request": [7, 18, 41], "someth": [7, 10, 11, 15, 26, 40], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 10, 15, 20], "horizont": 8, "scale": [8, 41], "backup": 8, "benefit": [8, 42], "flexibl": 8, "design": 8, "rest": [8, 26], "front": 8, "few": [8, 9, 23, 25, 26, 27], "reason": [8, 15, 20, 26, 38, 42], "why": 8, "million": 8, "singl": [8, 15], "capac": 8, "sometim": [8, 12, 13], "traffic": [8, 20, 39, 42], "reachabl": [8, 22], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 15, 22, 23, 25, 26, 27, 30], "expos": [8, 18, 22], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 35], "10903": 8, "10904": 8, "replica": [8, 29, 30, 31, 35, 36, 42], "abov": [8, 23, 25, 26, 27], "last": [8, 26], "db_address": 8, "could": [8, 35, 39, 41, 42], "long": [8, 10, 26, 40], "now": [8, 10, 26], "grafan": 9, "render": [9, 15], "sidecar": 9, "db": 9, "receiv": [9, 10, 42], "distribut": [9, 31, 39, 42], "email": [9, 10], "slack": [9, 10, 19], "displai": [9, 12, 13, 24], "enhanc": [10, 11], "notifi": [10, 11], "wrong": [10, 11, 15, 20, 26, 27, 40, 42], "shown": [10, 20, 23, 25, 26, 27], "condit": 10, "met": 10, "certain": 10, "defin": [10, 15, 22, 42], "what": [10, 26], "happen": [10, 20], "report": [10, 13, 17, 20, 42], "let": [10, 12, 13, 22, 27], "u": 10, "instancedown": 10, "expr": [10, 15, 26], "60": [10, 26], "annot": 10, "descript": [10, 35], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 15, 23], "special": 10, "notif": 10, "forward": 10, "low": [10, 42], "info": 10, "warn": [10, 35], "critic": 10, "inhibit": 10, "prioriti": 10, "mute": 10, "lower": [10, 42], "space": 10, "threshold": 10, "fire": 10, "silenc": 10, "signal": 10, "pager": 10, "duti": 10, "extens": 10, "easier": [10, 15], "dure": [10, 13, 20, 23, 25, 26, 27], "practic": [10, 35, 39], "suitabl": 10, "rememb": 10, "overridden": [10, 15], "duplic": [10, 42], "rout": [10, 31, 42], "repres": 10, "tree": 10, "win": [10, 20], "via": [10, 20], "sluck": 10, "wors": 10, "correctli": [10, 15, 22, 24], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 24, 26], "reduc": [10, 15, 29], "simul": 10, "actual": [10, 38], "show": [10, 15, 17, 26, 42], "propag": 10, "valu": [10, 15, 33, 34, 40, 42], "similar": [10, 15], "free": 10, "big": [10, 42], "bisect": 10, "problem": [10, 35, 41, 42], "thousand": [12, 13], "ten": [12, 13], "sheer": [12, 13], "too": [12, 13, 15, 34, 40], "much": [12, 13, 34, 42], "subset": [12, 13], "move": 12, "id": [12, 15, 20], "cluster_id": 12, "token": [12, 35], "dd": [12, 13], "resembl": [12, 13, 15], "filter": [12, 13, 35], "perspect": [12, 13], "graph": [12, 13, 15, 22, 24, 26, 42], "pai": [12, 13], "attent": [12, 13], "combin": [12, 13], "conflict": [12, 13], "remov": [12, 13, 22], "safest": 13, "cloud": [13, 14], "relabel": 13, "cost": [13, 42], "miss": [13, 20, 26], "origin": [13, 15, 26, 37], "export": [13, 20], "search": 13, "find": 13, "think": 13, "issu": [13, 15, 20, 35, 39, 42], "ll": 13, "sever": [14, 16, 43], "datadog": [14, 20], "integr": [14, 19], "explain": [15, 23, 25, 26, 27, 35], "intern": [15, 31, 42], "potenti": [15, 35, 42], "whenev": 15, "save": 15, "earlier": 15, "perman": 15, "eventu": 15, "made": 15, "larg": [15, 35], "maintain": 15, "verbos": 15, "element": [15, 35], "object": 15, "attribut": 15, "aliascolor": 15, "bar": 15, "fill": [15, 41], "grid": 15, "threshold1": 15, "null": 15, "threshold1color": 15, "rgba": 15, "216": 15, "200": 15, "threshold2": 15, "threshold2color": 15, "234": 15, "112": 15, "22": 15, "gridpo": 15, "w": [15, 20], "x": [15, 20, 21], "y": [15, 21], "isnew": 15, "legend": 15, "avg": 15, "max": 15, "min": 15, "linewidth": 15, "link": [15, 35], "nullpointmod": 15, "percentag": [15, 42], "pointradiu": 15, "flot": 15, "seriesoverrid": 15, "span": 15, "steppedlin": 15, "sum": [15, 26], "node_filesystem_avail": 15, "intervalfactor": 15, "legendformat": 15, "refid": 15, "timefrom": 15, "timeshift": 15, "titl": 15, "size": [15, 32, 42], "tooltip": 15, "msresolut": 15, "share": [15, 27, 34], "sort": [15, 42], "value_typ": 15, "cumul": 15, "transpar": 15, "xaxi": 15, "yax": 15, "percent": 15, "logbas": 15, "101": 15, "short": 15, "imagin": 15, "redund": 15, "css": 15, "hierarch": 15, "definit": [15, 22, 42], "inherit": 15, "row": [15, 42], "base_row": 15, "collaps": 15, "height": 15, "250px": 15, "Will": 15, "150px": 15, "output": 15, "consid": 15, "bytes_panel": 15, "byte": 15, "unit": 15, "axi": 15, "adjust": 15, "readabl": 15, "gb": 15, "mb": 15, "grasp": 15, "12": [15, 20, 26], "wa": [15, 42], "break": [15, 32, 42], "later": 15, "were": [15, 22, 42], "absolut": 15, "posit": 15, "width": 15, "backward": [15, 20, 22, 24], "ve": 15, "had": 15, "imposs": 15, "hand": 15, "overcom": 15, "transit": [15, 20, 24, 26], "calcul": [15, 20, 26], "taken": [15, 22], "still": [15, 26], "unlik": 15, "partial": 15, "24": [15, 26], "don": [15, 26], "python": 15, "pyyaml": 15, "make_dashboard": 15, "revers": 15, "usual": [15, 20, 35, 42], "wrapper": 15, "re": [15, 31], "refresh": 15, "generate_gener": 15, "ran": 15, "mayb": 15, "interfac": [16, 20], "2022": 17, "2023": 17, "2024": 17, "2021": 17, "2018": [17, 32], "14": [17, 20], "onlin": 18, "prometheus_port": 18, "prometheus_address": 18, "ask": 19, "question": 19, "discuss": 19, "forum": 19, "channel": 19, "56090": 20, "old": [20, 23, 24, 25, 26, 27], "howev": 20, "twice": 20, "easiest": 20, "scylla_manager1": 20, "messag": 20, "wait": [20, 36], "post": 20, "past": [20, 24], "mai": [20, 34, 36, 42], "ownership": 20, "la": 20, "grep": 20, "drwxr": 20, "xr": 20, "4096": 20, "jun": 20, "chown": 20, "appear": 20, "unreach": [20, 36], "immedi": 20, "suspect": 20, "tab": 20, "rang": [20, 26, 42], "align": 20, "On": 20, "41bd3db26240": 20, "entrypoin": 20, "ago": [20, 26], "23": 20, "7001": 20, "tcp": 20, "9042": 20, "9160": 20, "10000": 20, "click": 20, "usag": [20, 31, 42], "fetch": 20, "curl": 20, "scylla_nod": 20, "return": [20, 22, 28, 29, 30, 32, 36, 38, 42], "ef": 20, "gre": 20, "scylla_setup": 20, "9100": 20, "fallback": 20, "mechan": [20, 26, 29], "present": [20, 26], "newer": [20, 25, 26, 27], "reli": [20, 26, 42], "clean": 20, "recommend": [20, 23, 25, 26, 27, 42], "increas": [20, 32, 34, 42], "might": [20, 40], "overload": 20, "sysconfig": 20, "collector": 20, "captur": 20, "tshark": 20, "f": 20, "dst": 20, "eth0": 20, "toward": 20, "199": 20, "203": 20, "229": 20, "89": 20, "142": 20, "59212": 20, "ack": 20, "seq": 20, "317": 20, "78193": 20, "158080": 20, "len": 20, "tsval": 20, "79869679": 20, "tsecr": 20, "3347447210": 20, "74": 20, "60440": 20, "syn": 20, "29200": 20, "mss": 20, "1460": 20, "sack_perm": 20, "79988291": 20, "128": 20, "sinc": 22, "parallel": [22, 23, 25, 26, 27], "migrat": [22, 23, 25, 27], "lose": 22, "histor": [22, 26], "safe": 22, "page": [22, 24, 35], "unzip": [22, 23, 24, 25, 26, 27], "3001": [22, 23, 25, 26, 27], "9091": [22, 23, 25, 26, 27], "9094": 22, "fail": [22, 29, 31, 35, 42], "loss": 22, "everyth": 22, "stop": [22, 23, 24, 25, 26, 27], "format": [22, 26], "rule_fil": 22, "9111": 22, "phase": [22, 24], "serv": 22, "remote_read": 22, "v1": 22, "histori": [22, 24], "continu": [22, 23, 25, 26, 27], "back": [22, 29], "uninstal": [23, 25, 26, 27], "minor": [23, 25, 26, 27], "9095": [23, 25, 26, 27], "brows": [23, 25, 26, 27], "satisfi": [23, 25, 26, 27], "shut": [23, 25, 26, 27], "caus": [23, 25, 26, 27, 31, 42], "blackout": [23, 25, 26, 27], "normal": [23, 25, 26, 27], "oper": [23, 25, 26, 27, 35, 42], "complet": [23, 25, 26, 27], "switch": [24, 26], "fulli": 24, "affect": 24, "older": [24, 25, 26, 27], "helper": 24, "node_exporter_instal": 24, "ship": 24, "sub": 24, "color": 24, "simpli": 24, "side": [25, 26, 27, 28, 35, 42], "ensur": 26, "patch": 26, "skip": 26, "entir": 26, "p99": 26, "histogram_quantil": 26, "99": 26, "rate": [26, 42], "scylla_storage_proxy_coordinator_write_latency_bucket": 26, "le": 26, "fall": [26, 29], "year": 26, "month": 26, "360": 26, "our": 26, "nine": 26, "gap": 26, "minu": 26, "exact": 26, "goe": 26, "revert": 26, "stat": 26, "overlap": 26, "promtool": 26, "90": 26, "epoc": 26, "translat": 26, "mani": [26, 29, 30, 42], "echo": 26, "date": 26, "3600": 26, "exec": 26, "back_fil": 26, "took": 26, "hour": 26, "creation": 26, "inerupt": 26, "split": 26, "smaller": 26, "successfulli": 26, "half": 26, "itself": 27, "almost": 27, "alwai": [27, 33], "sylladb": 27, "prevent": [27, 42], "primari": [28, 42], "kei": [28, 42], "These": [28, 42], "kind": [28, 42], "bigger": 28, "care": [28, 29, 30, 42], "replicationfactor": [29, 30], "piec": 29, "determin": [29, 30, 36, 42], "repli": [29, 30, 32, 36, 38, 42], "unavail": [29, 42], "client": [29, 32, 35, 42], "respond": 29, "accompani": 29, "deep": 29, "understand": 29, "acknowledg": 30, "coordin": [30, 31, 36, 38, 42], "hint": 30, "fact": 30, "yet": 30, "ideal": [31, 42], "resourc": [31, 42], "replic": [31, 36, 38, 42], "prepar": [31, 35, 39], "statement": [31, 33, 35, 39], "balanc": [31, 34, 35, 42], "polici": 31, "cours": 31, "intro": 31, "recap": 31, "ring": [31, 42], "architectur": 31, "chunk": [32, 42], "overal": [32, 34, 42], "thu": 32, "www": [32, 39], "07": 32, "13": 32, "effici": [32, 42], "concret": 33, "thumb": 33, "favor": 33, "background": [34, 41], "impact": [34, 35], "compaction_static_shar": 34, "indic": [34, 35, 40, 41, 42], "overli": 34, "slow": 34, "enforc": 34, "min_threshold": 34, "compaction_enforce_min_threshold": 34, "bucket": 34, "sstabl": 34, "stc": 34, "recogn": 35, "bad": 35, "solv": 35, "categori": [35, 42], "jump": 35, "cell": 35, "model": [35, 39, 41, 42], "code": 35, "awar": 35, "due": 35, "unsatisfi": 35, "faulti": 35, "cach": 35, "evict": 35, "answer": [36, 38], "aka": 36, "factor": 36, "quorum": [36, 42], "hardwar": [37, 41], "occur": 37, "leav": 38, "risk": 38, "identifi": [38, 42], "evenli": 39, "across": 39, "becom": 39, "bottleneck": 39, "explan": 39, "08": 39, "field": 40, "being": 40, "defi": 40, "purpos": 40, "shed": 41, "repair": 41, "queue": 41, "upper": 42, "gaug": 42, "inspect": 42, "zero": 42, "mislead": 42, "panel": 42, "holder": 42, "inject": 42, "did": 42, "compound": 42, "column": 42, "order": 42, "BY": 42, "ks1": 42, "table_demo": 42, "text": 42, "int": 42, "desc": 42, "cat1": 42, "asc": 42, "overhead": 42, "thing": 42, "major": 42, "success": 42, "hurt": 42, "cl": 42, "expens": 42, "term": 42, "ONE": 42, "local_quorum": 42, "local_on": 42, "nearest": 42, "advisor": 43}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 12, 14, 27], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 35, 43], "stack": [1, 3, 5, 6, 8, 9, 11, 14, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 35, 43], "us": [2, 5, 6, 8, 12, 13, 15, 28, 29, 30, 43], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 15], "set": [2, 5, 22, 23, 25, 26, 27], "prometheu": [2, 4, 5, 6, 7, 8, 10, 18, 22], "grafana": [2, 5, 6, 7, 15, 20], "provis": 2, "data": [2, 6, 8, 20, 26], "sourc": [2, 8, 20], "file": [2, 6, 20, 23, 25, 26, 27], "dashboard": [2, 6, 12, 13, 15], "load": 2, "start": [2, 6, 7, 20, 26], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 13, 22, 23, 24, 25, 26, 27], "scylla": [3, 5, 6, 8, 11, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30, 35, 43], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 15, 22, 41], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 37], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 34], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 20], "configur": [5, 6, 8, 12, 13], "enabl": 5, "compat": 6, "matrix": [6, 17], "post": [6, 12, 13, 26, 32, 39], "node": [6, 37], "from": [6, 15, 20], "manag": [6, 7, 11, 20], "consul": 6, "api": [6, 18], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 20], "add": [6, 13], "addit": 6, "target": 6, "specif": 6, "version": [6, 22, 23, 24, 25, 26, 27], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 15, 23, 25, 26, 27, 35, 42], "all": [7, 23, 25, 26, 27, 29], "sh": [7, 15], "command": 7, "gener": [7, 15], "option": 7, "relat": [7, 22, 23, 24, 25, 26, 27], "ldap": 7, "support": [7, 17], "retent": 7, "period": [7, 26], "alert": [7, 10, 11, 22], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 28, 29, 30, 31, 32, 33, 39, 42], "updat": 8, "high": 9, "level": [9, 20, 29, 30, 36, 42], "architectur": 9, "sever": 10, "ad": [10, 12, 13, 15], "modifi": [10, 15], "tip": 10, "when": 10, "cloud": 12, "datadog": [12, 13], "integr": [12, 13], "overview": [12, 13], "And": [12, 13, 20], "agent": [12, 13], "upload": [12, 13], "record": 13, "rule": [13, 22], "more": 13, "metric": [13, 20, 26], "procedur": [14, 22, 23, 24, 25, 26, 27], "limit": 15, "consist": [15, 29, 30, 36, 42], "between": 15, "restart": [15, 26], "upgrad": [15, 20, 21, 22, 23, 24, 25, 26, 27], "templat": 15, "class": 15, "panel": 15, "exampl": 15, "format": 15, "layout": 15, "valid": [15, 22, 23, 24, 25, 26, 27], "refer": 16, "guid": [16, 19, 22, 23, 24, 25, 26, 27], "interfac": 18, "troubleshoot": [19, 20], "problem": 20, "2": [20, 22, 23, 24], "duplic": 20, "inform": 20, "A": 20, "contain": [20, 23, 25, 26, 27], "fail": [20, 36, 38], "To": 20, "permiss": 20, "No": 20, "point": 20, "solut": 20, "chart": 20, "show": 20, "error": [20, 37], "sign": 20, "server": [20, 23, 25, 26, 27], "notic": 20, "open": 20, "3": [20, 22, 24, 25, 26], "0": 20, "enterpris": 20, "2019": 20, "1": [20, 22, 24], "latenc": 20, "graph": 20, "ar": [20, 31, 32, 33, 39], "empti": 20, "reduc": 20, "total": 20, "number": [20, 27], "remov": 20, "interrupt": 20, "node_export": [20, 24], "work": 20, "wireshark": 20, "x": [22, 23, 24, 25, 26, 27], "latest": 22, "new": [22, 23, 24, 25, 26, 27], "4": [22, 26, 27], "move": [22, 23, 25, 26, 27], "old": 22, "b": [22, 27], "rollback": [22, 23, 24, 25, 26, 27], "link": [22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 39], "y": [23, 25, 26, 27], "": [23, 25, 26, 27], "i": [23, 25, 26, 27, 37], "run": [23, 25, 26, 27], "correct": [23, 25, 26, 27], "correctli": [23, 25, 27], "kill": [23, 25, 26, 27], "test": [25, 26, 27], "mode": [25, 26, 27], "second": 26, "migrat": 26, "backup": 26, "back": 26, "fill": 26, "determin": 26, "backfil": 26, "time": 26, "end": 26, "process": 26, "creat": 26, "copi": 26, "port": 27, "some": [28, 29, 30, 31, 32, 33, 36, 38], "allow": [28, 42], "filter": [28, 42], "univers": [29, 30, 31], "ani": 30, "token": [31, 42], "awar": [31, 42], "select": 32, "non": [32, 33], "page": [32, 42], "blog": [32, 39], "prepar": [33, 40, 42], "compact": 34, "take": 34, "lot": 34, "cpu": 34, "advisor": 35, "section": 35, "oper": [36, 38], "due": 36, "unsatisfi": 36, "o": 37, "can": 37, "indic": 37, "faulti": 37, "replica": 38, "side": 38, "cql": [39, 42], "balanc": 39, "among": 39, "shard": 39, "statement": [40, 42], "cach": 40, "evict": 40, "overload": 41, "optim": 42, "revers": 42, "read": 42, "cross": 42, "dc": 42, "request": 42}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"I/O Errors can indicate a node with a faulty disk": [[37, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Scylla Monitoring Stack Advisor": [[35, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[35, "the-advisor-section"]], "Some operations failed on the replica side": [[38, "some-operations-failed-on-the-replica-side"]], "Some queries use Consistency Level: ANY": [[30, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[30, "link-to-scylla-university"], [29, "link-to-scylla-university"]], "Some SELECT queries are non-paged": [[32, "some-select-queries-are-non-paged"]], "Blog-post Links": [[32, "blog-post-links"]], "Some operation failed due to unsatisfied consistency level": [[36, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Some queries are not token-aware": [[31, "some-queries-are-not-token-aware"]], "University link": [[31, "university-link"]], "CQL queries are not balanced among shards": [[39, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[39, "blog-post-link"]], "Compaction takes lots of memory and CPU": [[34, "compaction-takes-lots-of-memory-and-cpu"]], "Some queries are non-prepared": [[33, "some-queries-are-non-prepared"]], "Scylla Monitoring Stack Interfaces": [[18, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[18, "prometheus-api"]], "Scylla Monitoring Stack Support Matrix": [[17, "scylla-monitoring-stack-support-matrix"]], "Scylla Monitoring Stack Reference Guide": [[16, "scylla-monitoring-stack-reference-guide"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alerts severity": [[10, "alerts-severity"]], "Adding Alerts": [[10, "adding-alerts"]], "Modifying Alerts": [[10, "modifying-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "ScyllaDB Cloud Monitoring Datadog Integration": [[12, "scylladb-cloud-monitoring-datadog-integration"]], "ScyllaDB Monitoring Datadog Integration Overview": [[12, "scylladb-monitoring-datadog-integration-overview"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"], [13, "install-and-configure-the-datadog-agent"]], "Post configuration": [[12, "post-configuration"], [13, "post-configuration"]], "Upload the Dashboard": [[12, "upload-the-dashboard"], [13, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"], [13, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"], [13, "adding-monitor"]], "Scylla Monitoring Datadog Integration": [[13, "scylla-monitoring-datadog-integration"]], "Scylla Monitoring Datadog Integration Overview": [[13, "scylla-monitoring-datadog-integration-overview"]], "Add datadog recording rules": [[13, "add-datadog-recording-rules"]], "Adding more metrics to Datadog": [[13, "adding-more-metrics-to-datadog"]], "ScyllaDB Monitoring Stack Procedures": [[14, "scylladb-monitoring-stack-procedures"]], "Adding and Modifying Dashboards": [[15, "adding-and-modifying-dashboards"]], "General Limitations": [[15, "general-limitations"]], "Consistency Between Restarts": [[15, "consistency-between-restarts"]], "Consistency Between Upgrades": [[15, "consistency-between-upgrades"]], "Using Templated Dashboards": [[15, "using-templated-dashboards"]], "The Template Class System": [[15, "the-template-class-system"]], "Panel Example": [[15, "panel-example"]], "Grafana Formats and Layouts": [[15, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[15, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[15, "prerequisite"], [2, "prerequisite"]], "Validation": [[15, "validation"], [22, "validation"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[19, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Upgrade Procedure": [[23, "upgrade-procedure"], [24, "upgrade-procedure"], [27, "upgrade-procedure"], [26, "upgrade-procedure"], [25, "upgrade-procedure"], [22, "upgrade-procedure"]], "Install 2.y (The new version)": [[23, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[23, "setting-the-server-s-files"], [27, "setting-the-server-s-files"], [26, "setting-the-server-s-files"], [25, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[23, "validate-the-new-version-is-running-the-correct-version"], [27, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[23, "validate-the-version-installed-correctly"], [27, "validate-the-version-installed-correctly"], [25, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[23, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[23, "kill-all-containers"], [27, "kill-all-containers"], [26, "kill-all-containers"], [25, "kill-all-containers"]], "Rollback to version 2.x": [[23, "rollback-to-version-2-x"]], "Related Links": [[23, "related-links"], [24, "related-links"], [27, "related-links"], [26, "related-links"], [25, "related-links"], [22, "related-links"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[24, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[24, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[24, "install-the-new-monitoring-stack"], [22, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[24, "validate-the-upgrade"], [22, "validate-the-upgrade"]], "Rollback": [[24, "rollback"], [22, "rollback"]], "Troubleshoot Scylla Monitoring Stack": [[20, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[20, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[20, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[20, "a-container-fails-to-start"]], "Files And Directory Permissions": [[20, "files-and-directory-permissions"]], "No Data Points": [[20, "no-data-points"]], "Solution": [[20, "solution"], [20, "id1"], [20, "id2"], [20, "id3"]], "Grafana Chart Shows Error (!) Sign": [[20, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[20, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[20, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[20, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[20, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[20, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[20, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[20, "working-with-wireshark"]], "Some queries use ALLOW FILTERING": [[28, "some-queries-use-allow-filtering"]], "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b": [[27, "upgrade-guide-scylladb-monitoring-4-x-a-to-scylladb-monitoring-4-y-b"]], "Install 4.y.b (The new version)": [[27, "install-4-y-b-the-new-version"]], "Validate the port numbers": [[27, "validate-the-port-numbers"]], "Killing the new 4.y.b Monitoring stack in testing mode": [[27, "killing-the-new-4-y-b-monitoring-stack-in-testing-mode"]], "Move to version 4.y.b (the new version)": [[27, "move-to-version-4-y-b-the-new-version"]], "Rollback to version 4.x.a": [[27, "rollback-to-version-4-x-a"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[26, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[26, "install-4-y-the-new-version"]], "Running in test mode": [[26, "running-in-test-mode"]], "Running second monitoring stack": [[26, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[26, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[26, "migrating"]], "Move to version 4.y (the new version)": [[26, "move-to-version-4-y-the-new-version"]], "Backup": [[26, "backup"]], "Rollback to version 3.x": [[26, "rollback-to-version-3-x"], [25, "rollback-to-version-3-x"]], "Post-installation: Metrics back-filling": [[26, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[26, "determine-the-backfilling-period"]], "Determine the start time": [[26, "determine-the-start-time"]], "Determine the end time": [[26, "determine-the-end-time"]], "Backfilling Process": [[26, "backfilling-process"]], "backup": [[26, "id1"]], "Restart the monitoring stack": [[26, "restart-the-monitoring-stack"]], "Create the data files": [[26, "create-the-data-files"]], "Copy the data files": [[26, "copy-the-data-files"]], "Some queries use Consistency Level: ALL": [[29, "some-queries-use-consistency-level-all"]], "Upgrade Scylla Monitoring Stack": [[21, "upgrade-scylla-monitoring-stack"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[25, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[25, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[25, "move-to-version-3-y-the-new-version"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[22, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[22, "upgrade-to-the-latest-1-x-version"]], "3. Alerting Rules": [[22, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[22, "moving-to-prometheus-2-x"]], "a. Set the old system": [[22, "a-set-the-old-system"]], "b. Set the new system": [[22, "b-set-the-new-system"]], "Prepared statements cache eviction": [[40, "prepared-statements-cache-eviction"]], "Using Scylla Monitoring Stack": [[43, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[42, "the-cql-optimization"]], "Prepared Statements": [[42, "prepared-statements"]], "Token Aware": [[42, "token-aware"]], "Paged Queries": [[42, "paged-queries"]], "Reversed CQL Reads": [[42, "reversed-cql-reads"]], "ALLOW FILTERING": [[42, "allow-filtering"]], "Consistency Level": [[42, "consistency-level"]], "Cross DC": [[42, "cross-dc"]], "Cross DC Consistency Level": [[42, "cross-dc-consistency-level"]], "Cross DC read requests": [[42, "cross-dc-read-requests"]], "System Overload": [[41, "system-overload"]], "Minimal Production System Recommendations": [[4, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[4, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[4, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "ScyllaDB Monitoring Stack": [[1, "scylladb-monitoring-stack"], [9, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/master/sitemap.xml b/master/sitemap.xml new file mode 100644 index 000000000..634a28e6d --- /dev/null +++ b/master/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/cloud-integration.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/master/troubleshooting/index.html b/master/troubleshooting/index.html new file mode 100644 index 000000000..611ff36a4 --- /dev/null +++ b/master/troubleshooting/index.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Troubleshooting Guide for Scylla Monitoring Stack

                                    +
                                    +
                                    +

                                    Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/troubleshooting/monitor-troubleshoot.html b/master/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..b6ab7ee63 --- /dev/null +++ b/master/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,902 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Troubleshoot Scylla Monitoring Stack

                                    +

                                    This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                                    +
                                    +

                                    Problem

                                    +
                                    +

                                    Scylla-Manager 2.2 with Duplicate information

                                    +

                                    Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                                    +
                                      +
                                    • For Manager server: from 56090 to 5090

                                    • +
                                    • For Manager Agent: from 56090 to 5090

                                    • +
                                    +

                                    For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                                    +

                                    However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                                    +

                                    The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                                    +

                                    Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                                    +
                                    +
                                    +

                                    A Container Fails To Start

                                    +

                                    When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                                    +
                                    Wait for Prometheus container to start........Error: Prometheus container failed to start
                                    +
                                    +
                                    +

                                    Should this happen, check the Docker logs for more information.

                                    +
                                    docker logs aprom
                                    +
                                    +
                                    +

                                    Usually the reason for the failure is described in the logs.

                                    +
                                    +
                                    +

                                    Files And Directory Permissions

                                    +
                                    +

                                    Note

                                    +

                                    Avoid running Docker containers as root.

                                    +
                                    +

                                    The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                                    +

                                    If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                                    +
                                    +

                                    Note

                                    +

                                    If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                                    +
                                    +

                                    For example if your Prometheus data directory is /prom-data and you are using centos user

                                    +
                                    ls -la /|grep prom-data
                                    +
                                    +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                                    +
                                    +sudo chown -R centos:centos /prom-data
                                    +
                                    +ls -la /|grep prom-data
                                    +
                                    +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                                    +
                                    +
                                    +
                                    +
                                    +

                                    No Data Points

                                    +

                                    No data points on all data charts.

                                    +
                                    +

                                    Solution

                                    +

                                    If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                                    +
                                      +
                                    1. Login to the Prometheus console:

                                    2. +
                                    3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                                    4. +
                                    5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                                    6. +
                                    +
                                    +
                                      +
                                    • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                                    • +
                                    • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                                    • +
                                    • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                                    • +
                                    +
                                    +

                                    For example:

                                    +
                                    ./start-all.sh -v 3.1
                                    +
                                    +
                                    +

                                    More on start-all.sh options.

                                    +
                                    +
                                    +
                                    +

                                    Grafana Chart Shows Error (!) Sign

                                    +

                                    Run this procedure on the Scylla Monitoring Stack server.

                                    +

                                    If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                                    +
                                    +

                                    Solution

                                    +

                                    On the Scylla Monitoring Stack server:

                                    +
                                      +
                                    1. Check Prometheus is running using docker ps.

                                    2. +
                                    +
                                      +
                                    • If it is not running check the prometheus.yml for errors.

                                    • +
                                    +

                                    For example:

                                    +
                                    CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                                    +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                                    +
                                    +
                                    +
                                      +
                                    • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                                    • +
                                    +
                                    +
                                    +
                                    +

                                    Grafana Shows Server Level Metrics, but not Scylla Metrics

                                    +

                                    Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                                    +
                                    +

                                    Solution

                                    +
                                      +
                                    • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                                    • +
                                    +

                                    For example

                                    +
                                    curl 172.17.0.2:9180/metrics
                                    +
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Grafana Shows Scylla Metrics, but not Server Level Metrics

                                    +

                                    Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                                    +
                                    +

                                    Solution

                                    +

                                    1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                                    +
                                      +
                                    1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                                    2. +
                                    +
                                    +
                                    +

                                    Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                                    +

                                    While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                                    +

                                    If the node_exporter service is not starting it may need to be updated manually.

                                    +

                                    Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                                    +
                                    +
                                    +
                                    +

                                    Latencies Graphs Are empty

                                    +

                                    Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                                    +

                                    During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                                    +

                                    Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                                    +

                                    If only the latency graphs are missing, it is because of missing recording rules.

                                    +

                                    This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                                    +

                                    If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                                    +
                                    +
                                    +

                                    Reducing the total number of metrics

                                    +

                                    In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                                    +
                                    +

                                    Remove interrupts from node_exporter

                                    +

                                    By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                                    +
                                    +
                                    +
                                    +

                                    Working with Wireshark

                                    +

                                    No metrics shown in the Scylla Monitoring Stack.

                                    +
                                      +
                                    1. Install wireshark

                                    2. +
                                    +

                                    2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                                    +

                                    For example:

                                    +
                                    tshark -i eth0 -f "dst port 9180"
                                    +
                                    +
                                    +

                                    Capture from Scylla node towards Scylla Monitoring Stack server.

                                    +

                                    In this example, Scylla is running.

                                    +
                                    Monitor ip        Scylla node ip
                                    +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                                    +
                                    +
                                    +

                                    In this example, Scylla is not running

                                    +
                                    Monitor ip        Scylla node ip
                                    +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                                    +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/upgrade/index.html b/master/upgrade/index.html new file mode 100644 index 000000000..d8835a1bb --- /dev/null +++ b/master/upgrade/index.html @@ -0,0 +1,699 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Scylla Monitoring Stack

                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/master/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..f4591aa18 --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,810 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                                    +

                                    Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                                    +
                                    +

                                    Upgrade Procedure

                                    +
                                    +

                                    1. Upgrade to the latest 1.x version

                                    +

                                    Before starting the upgrade procedure, make sure you are running the latest 1.x version

                                    +
                                    +
                                    +

                                    2. Install the new monitoring stack

                                    +
                                      +
                                    1. Download the 2.x version from the release page.

                                    2. +
                                    3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                                    4. +
                                    5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                                      +
                                        +
                                      • scylla_servers.yml

                                      • +
                                      • scylla_manager_servers.yml

                                      • +
                                      • node_exporter_servers.yml

                                      • +
                                      +
                                    6. +
                                    7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                                    8. +
                                    +
                                    ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                                    +
                                    +

                                    While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                                    +
                                    ./kill-all.sh -g 3001 -p 9091 -m 9094
                                    +
                                    +
                                    +
                                    +

                                    Validation

                                    +

                                    Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                                    +
                                    +
                                    +
                                    +

                                    3. Alerting Rules

                                    +

                                    Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                                    +
                                    +
                                    +

                                    4. Moving to Prometheus 2.x

                                    +

                                    Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                                    +

                                    Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                                    +
                                    +

                                    a. Set the old system

                                    +

                                    The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                                    +
                                      +
                                    • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                                    • +
                                    • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                                    • +
                                    +
                                    +

                                    Note

                                    +

                                    After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                                    +
                                    +
                                    +
                                    +

                                    b. Set the new system

                                    +

                                    The following step will allow the new monitoring system to read historical metrics from the old system.

                                    +
                                      +
                                    • In the Prometheus prometheus.yml.template file add the following at the end:

                                    • +
                                    +
                                    remote_read:
                                    +  - url: "http://{ip}:9111/api/v1/read"
                                    +
                                    +
                                    +

                                    Where {ip} is the ip of the old system.

                                    +
                                      +
                                    • restart the new stack

                                    • +
                                    +
                                    +
                                    +
                                    +

                                    Validate the upgrade

                                    +

                                    You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                                    +
                                    +
                                    +
                                    +

                                    Rollback

                                    +

                                    In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..bd71ed133 --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,804 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                                    +
                                    +

                                    Upgrade Procedure

                                    +

                                    We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                    +

                                    Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                    +
                                    +

                                    Install 2.y (The new version)

                                    +
                                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                                    +unzip scylla-monitoring-2.y.zip
                                    +cd scylla-monitoring-scylla-monitoring-2.y/
                                    +
                                    +
                                    +

                                    Replace “y” with the new minor release number, for example, 2.1.zip

                                    +
                                    +
                                    +

                                    Setting the server’s files

                                    +

                                    Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                                    +
                                    cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                                    +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Validate the new version is running the correct version

                                    +

                                    Starting from Scylla-Monitoring version 2.2, you can run:

                                    +
                                    ./start-all.sh --version
                                    +
                                    +
                                    +

                                    To validate the Scylla-Monitoring version.

                                    +
                                    +
                                    +

                                    Validate the version installed correctly

                                    +

                                    To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                                    +
                                    ./start-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    Browse to http://{ip}:9091 +And check the Grafana dashboard

                                    +

                                    Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: do not use the local dir flag when testing!

                                    +
                                    +

                                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: Do not kill the 2.x version that is currently running.

                                    +
                                    +

                                    Use the following command to kill the containers:

                                    +
                                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    You can start and stop the new 2.y version while testing.

                                    +
                                    +
                                    +

                                    Move to version 2.y (the new version)

                                    +

                                    Note: migrating will cause a few seconds of blackout in the system.

                                    +

                                    We assume that you are using external volume to store the metrics data.

                                    +
                                    +

                                    Kill all containers

                                    +

                                    Follow the instruction on how to kill the 2.y version when in testing mode.

                                    +

                                    To kill the 2.x version containers, run:

                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +

                                    Start version 2.y in normal mode

                                    +

                                    From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                                    +
                                    ./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +

                                    Point your browser to http://{ip}:3000 and see that the data is there.

                                    +
                                    +
                                    +
                                    +

                                    Rollback to version 2.x

                                    +

                                    To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                                    +

                                    To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                                    +
                                    ./kill-all.sh
                                    +cd /path/to/scylla-grafana-2.x/
                                    +./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +
                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..873fabeac --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,768 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                                    +

                                    Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                                    +
                                    +

                                    Upgrade Procedure

                                    +
                                    +

                                    1. Validate node_exporter version

                                    +

                                    Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                                    +

                                    If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                                    +
                                    +
                                    +

                                    2. Install the new monitoring stack

                                    +
                                      +
                                    1. Download the 3.x version from the release page.

                                    2. +
                                    3. Unzip it into a different directory.

                                    4. +
                                    5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                                      +
                                        +
                                      • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                                      • +
                                      • scylla_manager_servers.yml

                                      • +
                                      +
                                      +
                                      +

                                      Note

                                      +

                                      The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                                      +
                                      +
                                      +
                                    6. +
                                    7. Stop the old monitoring stack

                                      +
                                      +
                                      ./kill-all.sh
                                      +
                                      +
                                      +
                                      +
                                    8. +
                                    9. Start the new monitoring stack

                                      +
                                      +
                                      ./start-all.sh -d /prometheus-data-path
                                      +
                                      +
                                      +
                                      +
                                    10. +
                                    +
                                    +
                                    +

                                    Validate the upgrade

                                    +

                                    You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                                    +

                                    Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                                    +
                                    +
                                    +
                                    +

                                    Rollback

                                    +

                                    To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..969402703 --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,812 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                                    +
                                    +

                                    Upgrade Procedure

                                    +

                                    We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                    +

                                    Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                    +
                                    +

                                    Install 3.y (The new version)

                                    +
                                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                                    +unzip scylla-monitoring-3.y.zip
                                    +cd scylla-monitoring-scylla-monitoring-3.y/
                                    +
                                    +
                                    +

                                    Replace “y” with the new minor release number, for example, 3.0.1.zip

                                    +
                                    +
                                    +

                                    Setting the server’s files

                                    +

                                    Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                    +
                                    cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                    +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Validate the new version is running the correct version

                                    +

                                    Starting from Scylla-Monitoring version 2.2, you can run:

                                    +
                                    ./start-all.sh --version
                                    +
                                    +
                                    +

                                    To validate the Scylla-Monitoring version.

                                    +
                                    +
                                    +

                                    Validate the version installed correctly

                                    +

                                    To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                                    +
                                    ./start-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    Browse to http://{ip}:9091 +And check the Grafana dashboard

                                    +

                                    Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: do not use the local dir flag when testing!

                                    +
                                    +

                                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: Do not kill the 3.x version that is currently running.

                                    +
                                    +
                                    +
                                    +

                                    Killing the new 3.y Monitoring stack in testing mode

                                    +

                                    Use the following command to kill the containers:

                                    +
                                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    You can start and stop the new 3.y version while testing.

                                    +
                                    +
                                    +

                                    Move to version 3.y (the new version)

                                    +

                                    Note: migrating will cause a few seconds of blackout in the system.

                                    +

                                    We assume that you are using external volume to store the metrics data.

                                    +
                                    +

                                    Kill all containers

                                    +

                                    At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                    +

                                    Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                                    +

                                    kill the older 3.x version containers by running:

                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +

                                    Start version 3.y in normal mode

                                    +

                                    From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                                    +
                                    ./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +

                                    Point your browser to http://{ip}:3000 and see that the data is there.

                                    +
                                    +
                                    +
                                    +

                                    Rollback to version 3.x

                                    +

                                    To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                    +

                                    To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                                    +
                                    ./kill-all.sh
                                    +cd /path/to/scylla-grafana-3.x/
                                    +./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +
                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..b137b74bd --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,955 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                                    +
                                    +

                                    Upgrade Procedure

                                    +

                                    We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                                    +

                                    Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                                    +
                                    +

                                    Install 4.y (The new version)

                                    +
                                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                                    +unzip scylla-monitoring-4.y.zip
                                    +cd scylla-monitoring-scylla-monitoring-4.y/
                                    +
                                    +
                                    +

                                    Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                                    +
                                    +
                                    +

                                    Setting the server’s files

                                    +

                                    Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                    +
                                    cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                    +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Validate the new version is running the correct version

                                    +

                                    run:

                                    +
                                    ./start-all.sh --version
                                    +
                                    +
                                    +

                                    To validate the Scylla-Monitoring version.

                                    +
                                    +
                                    +
                                    +

                                    Running in test mode

                                    +

                                    This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                                    +
                                    +

                                    Running second monitoring stack

                                    +

                                    We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                                    +
                                    ./start-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    Browse to http://{ip}:9091 and check the Grafana dashboard.

                                    +

                                    Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: do not use the local dir flag when testing!

                                    +
                                    +

                                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: Do not kill the 3.x version that is currently running!

                                    +
                                    +
                                    +
                                    +

                                    Killing the new 4.y Monitoring stack in testing mode

                                    +

                                    Use the following command to kill the containers:

                                    +
                                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    You can start and stop the new 4.y version while testing.

                                    +
                                    +
                                    +
                                    +

                                    Migrating

                                    +
                                    +

                                    Move to version 4.y (the new version)

                                    +

                                    Note: migrating will cause a few seconds of blackout in the system.

                                    +

                                    We assume that you are using external volume to store the metrics data.

                                    +
                                    +

                                    Backup

                                    +

                                    We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                                    +
                                    +
                                    +

                                    Kill all containers

                                    +

                                    At this point you have two monitoring stacks installed with the older version running.

                                    +

                                    If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                                    +

                                    kill the older 3.x version containers by running:

                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +

                                    Start version 4.y in normal mode

                                    +

                                    From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                                    +
                                    ./start-all.sh -d /path/to/copy/data/dir
                                    +
                                    +
                                    +

                                    Point your browser to http://{ip}:3000 and see that the data is there.

                                    +
                                    +
                                    +
                                    +

                                    Rollback to version 3.x

                                    +

                                    To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                    +

                                    To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                                    +
                                    ./kill-all.sh
                                    +cd /path/to/scylla-grafana-3.x/
                                    +./start-all.sh -d /path/to/original/data/dir
                                    +
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Post-installation: Metrics back-filling

                                    +

                                    Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                                    +

                                    For example, this is a recording rule that calculates the p99 write latency:

                                    +
                                    - record: wlatencyp99
                                    +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                                    +  labels:
                                    +    by: "instance,shard"
                                    +
                                    +
                                    +

                                    For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                                    +

                                    Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                                    +
                                    +
                                    +

                                    Note

                                    +

                                    If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                                    +
                                    +
                                    +
                                    +../_images/before-backfilling.png +
                                    +

                                    This is an example of missing latency graph

                                    +
                                    +
                                    +

                                    The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                                    +

                                    For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                                    +

                                    In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                                    +

                                    The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                                    +
                                    +

                                    Determine the backfilling period

                                    +

                                    When you run the backfilling process you need to determine the start time and end time.

                                    +
                                    +

                                    Determine the start time

                                    +

                                    The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                                    +

                                    If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                                    +

                                    For the rest of this example, we will assume that your retention time is 360 days.

                                    +
                                    +
                                    +

                                    Determine the end time

                                    +

                                    Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                                    +

                                    If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                                    +

                                    That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                                    +

                                    The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                                    +
                                    +
                                    +
                                    +

                                    Backfilling Process

                                    +
                                    +

                                    backup

                                    +

                                    If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                                    +

                                    To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                                    +
                                    +
                                    +

                                    Restart the monitoring stack

                                    +

                                    You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                                    +

                                    -b "--storage.tsdb.allow-overlapping-blocks"

                                    +
                                    +
                                    +

                                    Create the data files

                                    +

                                    We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                                    +

                                    The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                                    +

                                    Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                                    +
                                    docker exec -it aprom sh
                                    +cd /prometheus/data/
                                    +promtool tsdb create-blocks-from rules \
                                    +--start $start \
                                    +--end $end \
                                    +--url http://localhost:9090 \
                                    +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                                    +
                                    +
                                    +

                                    It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                                    +
                                    +
                                    +

                                    Note

                                    +

                                    Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Copy the data files

                                    +

                                    Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                                    +

                                    Copy the data files to the Prometheus directory:

                                    +
                                    cp data/* .
                                    +
                                    +
                                    +

                                    The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                                    +

                                    Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                                    +
                                    +../_images/after-backfilling.jpg +
                                    +

                                    Un example: after loading half of the data

                                    +
                                    +
                                    +
                                    +
                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/master/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..921a83afb --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,827 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1.

                                    +
                                    +

                                    Upgrade Procedure

                                    +

                                    We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                    +

                                    Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                    +
                                    +

                                    Install 4.y.b (The new version)

                                    +
                                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip
                                    +unzip scylla-monitoring-4.y.b.zip
                                    +cd scylla-monitoring-scylla-monitoring-4.y.b/
                                    +
                                    +
                                    +

                                    Replace “y” with the new minor release number, for example, 4.0.1.zip

                                    +
                                    +
                                    +

                                    Setting the server’s files

                                    +

                                    Copy the target files scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                    +
                                    cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/
                                    +cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/
                                    +
                                    +
                                    +
                                    +

                                    Validate the port numbers

                                    +

                                    ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent.

                                    +

                                    Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target.

                                    +
                                    +

                                    Caution

                                    +

                                    As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics.

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Validate the new version is running the correct version

                                    +

                                    Run:

                                    +
                                    ./start-all.sh --version
                                    +
                                    +
                                    +

                                    To validate the Scylla-Monitoring version.

                                    +
                                    +
                                    +

                                    Validate the version installed correctly

                                    +

                                    To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack.

                                    +
                                    ./start-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    Browse to http://{ip}:9091 +And check the Grafana dashboard

                                    +

                                    Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: do not use the local dir flag when testing!

                                    +
                                    +

                                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: Do not kill the 4.x.a version that is currently running.

                                    +
                                    +
                                    +
                                    +

                                    Killing the new 4.y.b Monitoring stack in testing mode

                                    +

                                    Use the following command to kill the containers:

                                    +
                                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    You can start and stop the new 4.y.b version while testing.

                                    +
                                    +
                                    +

                                    Move to version 4.y.b (the new version)

                                    +

                                    Note: migrating will cause a few seconds of blackout in the system.

                                    +

                                    We assume that you are using external volume to store the metrics data.

                                    +
                                    +

                                    Kill all containers

                                    +

                                    At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                    +

                                    Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y.b Monitoring stack in testing mode +in the previous section

                                    +

                                    kill the older 4.x.a version containers by running:

                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +

                                    Start version 4.y.b in normal mode

                                    +

                                    From the new root of the scylla-monitoring-scylla-monitoring-4.y.b run

                                    +
                                    ./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +

                                    Point your browser to http://{ip}:3000 and see that the data is there.

                                    +
                                    +
                                    +
                                    +

                                    Rollback to version 4.x.a

                                    +

                                    To rollback during the testing mode, follow Killing the new 4.y.b Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                    +

                                    To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run:

                                    +
                                    ./kill-all.sh
                                    +cd /path/to/scylla-grafana-4.x.a/
                                    +./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +
                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlAllowFiltering.html b/master/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..6bfbeaee0 --- /dev/null +++ b/master/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Some queries use ALLOW FILTERING

                                    +

                                    Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                                    +

                                    These kinds of queries can create a bigger load on Scylla, and should be used with care.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlCLAll.html b/master/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..5a8781d20 --- /dev/null +++ b/master/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,706 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Some queries use Consistency Level: ALL

                                    +

                                    Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                                    +

                                    Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                                    +

                                    Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlCLAny.html b/master/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..d045cc396 --- /dev/null +++ b/master/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Some queries use Consistency Level: ANY

                                    +

                                    Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                                    +

                                    Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlNoTokenAware.html b/master/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..89bb3b624 --- /dev/null +++ b/master/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Some queries are not token-aware

                                    +

                                    Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                                    +

                                    Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlNonPaged.html b/master/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..9f6953807 --- /dev/null +++ b/master/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Some SELECT queries are non-paged

                                    +

                                    By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                                    +
                                    +

                                    Blog-post Links

                                    +

                                    https://www.scylladb.com/2018/07/13/efficient-query-paging/

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlNonPrepared.html b/master/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..06f226a94 --- /dev/null +++ b/master/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Some queries are non-prepared

                                    +

                                    Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/heavyCompaction.html b/master/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..6af14929b --- /dev/null +++ b/master/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Compaction takes lots of memory and CPU

                                    +

                                    ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                                    +

                                    If this is the case, you can do one of the following:

                                    +
                                      +
                                    • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                                      +
                                      +
                                        +
                                      • In the scylla.yml configuration file: compaction_static_shares: 100

                                      • +
                                      • In the command line when starting ScyllaDB: --compaction-static-shares 100

                                      • +
                                      +
                                      +

                                      You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                                      +
                                    • +
                                    • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                                    • +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/index.html b/master/use-monitoring/advisor/index.html new file mode 100644 index 000000000..65b314a34 --- /dev/null +++ b/master/use-monitoring/advisor/index.html @@ -0,0 +1,720 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Stack Advisor

                                    +
                                    +
                                    +

                                    The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                                    +
                                    +

                                    The Advisor section

                                    +
                                    +../../_images/advisor_panel.png +
                                    +

                                    The Advisor section

                                    +
                                    +
                                    +

                                    The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                                    +

                                    For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                                    +

                                    Each Advisor issue is explained in detail:

                                    + +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/nodeCLErrors.html b/master/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..6337f0c7f --- /dev/null +++ b/master/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Some operation failed due to unsatisfied consistency level

                                    +

                                    ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                                    +

                                    For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                                    +

                                    When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/nodeIOErrors.html b/master/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..1e6d33cd5 --- /dev/null +++ b/master/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    I/O Errors can indicate a node with a faulty disk

                                    +

                                    I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/nodeLocalErrors.html b/master/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..abbd57d86 --- /dev/null +++ b/master/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Some operations failed on the replica side

                                    +

                                    ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                                    +

                                    An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/nonBalancedcqlTraffic.html b/master/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..2344d8d98 --- /dev/null +++ b/master/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    CQL queries are not balanced among shards

                                    +

                                    For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                                    +

                                    There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                                    +
                                    +

                                    Blog post link

                                    +

                                    https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/preparedCacheEviction.html b/master/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..eb31270f4 --- /dev/null +++ b/master/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    Prepared statements cache eviction

                                    +

                                    Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                                    +
                                      +
                                    • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                                    • +
                                    • The prepared statements cache might be too small for the number of prepared statements.

                                    • +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/systemOverload.html b/master/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..55ed63b51 --- /dev/null +++ b/master/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    System Overload

                                    +

                                    There could be multiple indications that a system is overloaded:

                                    +
                                      +
                                    • Timeouts

                                    • +
                                    • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                                    • +
                                    • CPU at 100% when no background process (like compaction or repair) runs.

                                    • +
                                    • Queues are getting filled.

                                    • +
                                    +

                                    If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/cql-optimization.html b/master/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..2e0ad9f39 --- /dev/null +++ b/master/use-monitoring/cql-optimization.html @@ -0,0 +1,812 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + + + +
                                    +

                                    The CQL Optimization

                                    +

                                    The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                                    +
                                    +../_images/cql_optimization_master.png +
                                    +

                                    The CQL Dashboard

                                    +
                                    +
                                    +

                                    The upper part of the dashboard holds CQL related metrics.

                                    +

                                    The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                                    +
                                    +

                                    Note

                                    +

                                    Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                                    +
                                    +

                                    The following sections describe each of the dashboard’s panel

                                    +
                                    +

                                    Prepared Statements

                                    +

                                    Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                                    +

                                    Using prepared statements has the following benefits:

                                    +
                                      +
                                    • The database only needs to parse the query once

                                    • +
                                    • The driver can route the query to the right node

                                    • +
                                    • Using place-holders and values is safer and prevents CQL-Injection

                                    • +
                                    +

                                    The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                                    +

                                    The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                                    +
                                    +
                                    +

                                    Token Aware

                                    +

                                    Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                                    +

                                    Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                                    +

                                    The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                                    +

                                    The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                                    +
                                    +
                                    +

                                    Paged Queries

                                    +

                                    By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                                    +

                                    The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                                    +

                                    The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                                    +
                                    +
                                    +

                                    Reversed CQL Reads

                                    +

                                    ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                                    +

                                    We strongly recommend using use the correct ordering. +Querying with an order different than the order the CLUSTERING ORDER BY was defined is supported, but not advisable.

                                    +

                                    For example, look at the following table:

                                    +
                                    CREATE TABLE ks1.table_demo (
                                    +   category text,
                                    +   type int,
                                    +   PRIMARY KEY (category, type))
                                    +WITH CLUSTERING ORDER BY (type DESC);
                                    +
                                    +
                                    +

                                    The following query uses reverse order:

                                    +
                                    select * from ks1.table_demo where category='cat1' order by type ASC;
                                    +
                                    +
                                    +

                                    The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                                    +

                                    The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                                    +
                                    +
                                    +

                                    ALLOW FILTERING

                                    +

                                    Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                                    +

                                    These kinds of queries can create a big load on the system, and should be used with care.

                                    +

                                    The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                                    +

                                    The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                                    +

                                    The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                                    +

                                    The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                                    +

                                    The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                                    +
                                    +
                                    +

                                    Consistency Level

                                    +

                                    Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                                    +

                                    The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                                    +

                                    Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                                    +

                                    The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                                    +

                                    The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                                    +

                                    The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                                    +

                                    The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                                    +
                                    +
                                    +

                                    Cross DC

                                    +

                                    Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                                    +
                                    +
                                    +

                                    Cross DC Consistency Level

                                    +

                                    Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                                    +
                                    +
                                    +

                                    Cross DC read requests

                                    +
                                    +

                                    Note

                                    +

                                    The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                                    +
                                    +

                                    In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                                    +

                                    The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/index.html b/master/use-monitoring/index.html new file mode 100644 index 000000000..e04717937 --- /dev/null +++ b/master/use-monitoring/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    +

                                    Caution

                                    +

                                    + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                    +
                                    + + + +
                                    + +
                                    + +
                                    +

                                    Using Scylla Monitoring Stack

                                    +
                                    +
                                    +

                                    There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/.buildinfo b/stable/.buildinfo new file mode 100644 index 000000000..999baa1dc --- /dev/null +++ b/stable/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 00a8f87e47aea08bf811ff5385688df4 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/stable/.doctrees/common/monitor-description.doctree b/stable/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..ae0495425 Binary files /dev/null and b/stable/.doctrees/common/monitor-description.doctree differ diff --git a/stable/.doctrees/environment.pickle b/stable/.doctrees/environment.pickle new file mode 100644 index 000000000..74a68ed6f Binary files /dev/null and b/stable/.doctrees/environment.pickle differ diff --git a/stable/.doctrees/index.doctree b/stable/.doctrees/index.doctree new file mode 100644 index 000000000..3f7e7c686 Binary files /dev/null and b/stable/.doctrees/index.doctree differ diff --git a/stable/.doctrees/install/docker-compose.doctree b/stable/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..26a8ad4af Binary files /dev/null and b/stable/.doctrees/install/docker-compose.doctree differ diff --git a/stable/.doctrees/install/index.doctree b/stable/.doctrees/install/index.doctree new file mode 100644 index 000000000..fc8ee854e Binary files /dev/null and b/stable/.doctrees/install/index.doctree differ diff --git a/stable/.doctrees/install/min-prod-hw.doctree b/stable/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..1e8d297d1 Binary files /dev/null and b/stable/.doctrees/install/min-prod-hw.doctree differ diff --git a/stable/.doctrees/install/monitor-without-docker.doctree b/stable/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..341aa7413 Binary files /dev/null and b/stable/.doctrees/install/monitor-without-docker.doctree differ diff --git a/stable/.doctrees/install/monitoring-stack.doctree b/stable/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..a12843386 Binary files /dev/null and b/stable/.doctrees/install/monitoring-stack.doctree differ diff --git a/stable/.doctrees/install/start-all.doctree b/stable/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..f1e9c1eb8 Binary files /dev/null and b/stable/.doctrees/install/start-all.doctree differ diff --git a/stable/.doctrees/install/thanos.doctree b/stable/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..d8b89e3fb Binary files /dev/null and b/stable/.doctrees/install/thanos.doctree differ diff --git a/stable/.doctrees/intro.doctree b/stable/.doctrees/intro.doctree new file mode 100644 index 000000000..dda20738a Binary files /dev/null and b/stable/.doctrees/intro.doctree differ diff --git a/stable/.doctrees/procedures/alerts/alerting.doctree b/stable/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..eed77d36e Binary files /dev/null and b/stable/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/stable/.doctrees/procedures/alerts/index.doctree b/stable/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..72adea218 Binary files /dev/null and b/stable/.doctrees/procedures/alerts/index.doctree differ diff --git a/stable/.doctrees/procedures/datadog/cloud-integration.doctree b/stable/.doctrees/procedures/datadog/cloud-integration.doctree new file mode 100644 index 000000000..c69494aee Binary files /dev/null and b/stable/.doctrees/procedures/datadog/cloud-integration.doctree differ diff --git a/stable/.doctrees/procedures/datadog/index.doctree b/stable/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..40fe64111 Binary files /dev/null and b/stable/.doctrees/procedures/datadog/index.doctree differ diff --git a/stable/.doctrees/procedures/index.doctree b/stable/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..ab3c4f425 Binary files /dev/null and b/stable/.doctrees/procedures/index.doctree differ diff --git a/stable/.doctrees/procedures/updating-dashboard.doctree b/stable/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..75b4a8b7f Binary files /dev/null and b/stable/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/stable/.doctrees/reference/index.doctree b/stable/.doctrees/reference/index.doctree new file mode 100644 index 000000000..031bcb321 Binary files /dev/null and b/stable/.doctrees/reference/index.doctree differ diff --git a/stable/.doctrees/reference/matrix.doctree b/stable/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..ed287e6bb Binary files /dev/null and b/stable/.doctrees/reference/matrix.doctree differ diff --git a/stable/.doctrees/reference/monitoring-apis.doctree b/stable/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..afed75d0a Binary files /dev/null and b/stable/.doctrees/reference/monitoring-apis.doctree differ diff --git a/stable/.doctrees/troubleshooting/index.doctree b/stable/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..f4eb3c7e4 Binary files /dev/null and b/stable/.doctrees/troubleshooting/index.doctree differ diff --git a/stable/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/stable/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..3d8710933 Binary files /dev/null and b/stable/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/stable/.doctrees/upgrade/index.doctree b/stable/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..44b4c4135 Binary files /dev/null and b/stable/.doctrees/upgrade/index.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..046af7703 Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..4d00bfeaa Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..324dce6c2 Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..26dcb6e14 Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..b2cb9639c Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..99b3d16bc Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/stable/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..6ce5f5e99 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/stable/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..3269aaaf4 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/stable/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..4009f1f10 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/stable/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..46e9e9899 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/stable/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..e2d6c7eb4 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/stable/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..dc7b7682c Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/stable/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..3b1eb9d6c Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/index.doctree b/stable/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..8a90b852e Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/stable/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..038c38eb4 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/stable/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..4c3393743 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/stable/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..7dca6c392 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/stable/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..93eef28c7 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/stable/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..8bda87ae1 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/systemOverload.doctree b/stable/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..09cfe6a1b Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/stable/.doctrees/use-monitoring/cql-optimization.doctree b/stable/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..35e921338 Binary files /dev/null and b/stable/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/stable/.doctrees/use-monitoring/index.doctree b/stable/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..5c20f9d79 Binary files /dev/null and b/stable/.doctrees/use-monitoring/index.doctree differ diff --git a/stable/.nojekyll b/stable/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/stable/404.html b/stable/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/stable/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                                    +

                                    404

                                    +

                                    The ScyllaDB monster ate your page!

                                    +

                                    + Home +

                                    +
                                    + + + \ No newline at end of file diff --git a/stable/CNAME b/stable/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/stable/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/stable/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/stable/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..73651eed6 --- /dev/null +++ b/stable/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,495 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_healthcheck_cql_status_ag + expr: sum(scylla_manager_healthcheck_cql_status) by(cluster) + labels: + by: "cluster" + status: "1" + dd: "1" + - record: scylla_manager_healthcheck_cql_status_ag + expr: count(scylla_manager_healthcheck_cql_status==0) by(cluster) + labels: + by: "cluster" + status: "0" + dd: "1" diff --git a/stable/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/stable/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/stable/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/stable/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/stable/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/stable/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/stable/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/stable/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/stable/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/stable/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/stable/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/stable/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/stable/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/stable/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/stable/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/stable/_images/1.png b/stable/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/stable/_images/1.png differ diff --git a/stable/_images/2.png b/stable/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/stable/_images/2.png differ diff --git a/stable/_images/3.png b/stable/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/stable/_images/3.png differ diff --git a/stable/_images/advisor_panel.png b/stable/_images/advisor_panel.png new file mode 100644 index 000000000..89b9a5950 Binary files /dev/null and b/stable/_images/advisor_panel.png differ diff --git a/stable/_images/after-backfilling.jpg b/stable/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/stable/_images/after-backfilling.jpg differ diff --git a/stable/_images/alertmanager.png b/stable/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/stable/_images/alertmanager.png differ diff --git a/stable/_images/before-backfilling.png b/stable/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/stable/_images/before-backfilling.png differ diff --git a/stable/_images/cql_optimization_master.png b/stable/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/stable/_images/cql_optimization_master.png differ diff --git a/stable/_images/datadog.png b/stable/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/stable/_images/datadog.png differ diff --git a/stable/_images/grafana.png b/stable/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/stable/_images/grafana.png differ diff --git a/stable/_images/monitor.png b/stable/_images/monitor.png new file mode 100644 index 000000000..cf691ecb3 Binary files /dev/null and b/stable/_images/monitor.png differ diff --git a/stable/_images/monitoring_stack.png b/stable/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/stable/_images/monitoring_stack.png differ diff --git a/stable/_images/monitoring_stack1.png b/stable/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/stable/_images/monitoring_stack1.png differ diff --git a/stable/_sources/common/monitor-description.rst.txt b/stable/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/stable/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/stable/_sources/index.rst.txt b/stable/_sources/index.rst.txt new file mode 100644 index 000000000..3dbe94edd --- /dev/null +++ b/stable/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/stable/_sources/install/docker-compose.rst.txt b/stable/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/stable/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/stable/_sources/install/index.rst.txt b/stable/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/stable/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/stable/_sources/install/min-prod-hw.rst.txt b/stable/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..6fda62cc1 --- /dev/null +++ b/stable/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                                    + + + + + + + + + + + +
                                    # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                    00
                                    + +
                                    + \ No newline at end of file diff --git a/stable/_sources/install/monitor-without-docker.rst.txt b/stable/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..3a1f7e7c3 --- /dev/null +++ b/stable/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,492 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                                    `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.26.0 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.26.0.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.26.0.linux-amd64/ + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.49.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.49.1/prometheus-2.49.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories + +.. code-block:: shell + + sudo mkdir -p /prometheus/data + sudo mkdir -p /etc/prometheus/prom_rules/ + sudo mkdir -p /etc/scylla.d/prometheus/ + +.. note:: To run Promethues as non-root user, you would need to give read write and execute permissions to those directories. + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat /etc/scylla.d/prometheus/scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + cat /etc/scylla.d/prometheus/scylla_manager_server.yml + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd cd prometheus-2.49.1.linux-amd64/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 10.3.3 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different, we will assume that you used yum/dnf install. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +4. Provision the Dashboards + +For example Scylla Open-source version 5.4 and Scylla manager version 2.4 + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.5.4.yaml + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + + +Edit the ``load.*`` you just copied. For example + +.. code-block:: shell + + $ cat /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml + apiVersion: 1 + + providers: + - name: 'manager_3.3' + orgId: 1 + folder: '' + type: file + disableDeletion: false + allowUiUpdates: true + updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards + options: + path: /var/lib/grafana/dashboards/manager_3.3 + + $ cat /etc/grafana/provisioning/dashboards/load.5.4.yaml + apiVersion: 1 + + providers: + - name: '5.4' + orgId: 1 + folder: '' + type: file + disableDeletion: false + allowUiUpdates: true + updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards + options: + path: /var/lib/grafana/dashboards/ver_5.4 +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configuration`_. + +.. _`grafana configuration`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/stable/_sources/install/monitoring-stack.rst.txt b/stable/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..5843f351a --- /dev/null +++ b/stable/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,412 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                                    `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.6 + - 2.48.1 + - 10.2.2 + * - 4.5 + - 2.47.1 + - 10.1.5 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/stable/_sources/install/start-all.rst.txt b/stable/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..f270d092f --- /dev/null +++ b/stable/_sources/install/start-all.rst.txt @@ -0,0 +1,107 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +**--compose** This is an experimental option. When set, it initiates a two-stage process. Firstly, a ``docker-compose.yml`` file is created along with an ``.env`` file. Following this, the script executes ``docker-compose up``. Please note that having docker-compose is a prerequisite. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/stable/_sources/install/thanos.rst.txt b/stable/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/stable/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/stable/_sources/intro.rst.txt b/stable/_sources/intro.rst.txt new file mode 100644 index 000000000..78481f6c3 --- /dev/null +++ b/stable/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/stable/_sources/procedures/alerts/alerting.rst.txt b/stable/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..d196123bc --- /dev/null +++ b/stable/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,114 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in files placed under `prometheus/prom_rules/`. Prometheus will load any file that ends with `yml` or `yaml`. + +Each Prometheus alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "error" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **error**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alerts severity +--------------- + +Prometheus uses the following severities from low to high: **info**, **warn**, **error**, **critical**. + +The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the **error** alert for disk-full is firing, it silences the **warn** alert. + +When adding your own alerts, you can use the severities to signal the action's importance, for example **critical** would be a pager-duty, while an **error** will be an email. + +Adding Alerts +---------------- + +Add your own alerts in a separate file with a **yml** or **yaml** extension. Making it easier during upgrade. + +Modifying Alerts +---------------- + +It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/stable/_sources/procedures/alerts/index.rst.txt b/stable/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/stable/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/stable/_sources/procedures/datadog/cloud-integration.rst.txt b/stable/_sources/procedures/datadog/cloud-integration.rst.txt new file mode 100644 index 000000000..320b0e847 --- /dev/null +++ b/stable/_sources/procedures/datadog/cloud-integration.rst.txt @@ -0,0 +1,58 @@ +============================================= +ScyllaDB Cloud Monitoring Datadog Integration +============================================= + +To allow external server scrapping, you will need to enable the `Prometheus proxy `_. +The Datadog agent reads from the proxy, which reads from the Promethues server. + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading ScyllaDB dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +ScyllaDB Monitoring Datadog Integration Overview +================================================ +A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog. + +Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those. + +Install And configure the Datadog Agent +======================================= + +Start by installing DataDog Agent on a server with access to ScyllaDB Cloud Prometheus Proxy server, following `Installation `_ guide. +The datadog agent should run on a machine that can reach the Prometheus Proxy server. + +Once the Datadog agent is working, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. ScyllaDB metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/stable/_sources/procedures/datadog/index.rst.txt b/stable/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bb6f4d66 --- /dev/null +++ b/stable/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,81 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, Check the cloud users `specific guide `_. + +Scylla Monitoring Datadog Integration Overview +============================================== +A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog. + +Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those. +That labeling is done in two places: recording rules and the Prometheus relabel config. + +Recording rules aggregate the metrics so that they will be reported per instance instead of per shard, and they mark the result with a label. + +Prometheus relabel config marks metrics that are reported per instance, like disk and CPU. + + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml +Download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. + +Adding more metrics to Datadog +============================== +To add a missing metric, do the following: + +For ScyllaDB metrics, add a recording rule to report an aggregated per instance of that metric. We suggest placing it in a different YAML file to simplify an upgrade. + +OS-related metrics originate from node_exporter, and Prometheus labels them during scraping. +To label a node exporter metrics, edit the prometheus/prometheus.yml.template search for the job_name: node_exporter and find the metric_relabel_configs. +You can add a metric name to the regex section. + +If you think that metric is helpful for other users, open an issue, and we'll add it. \ No newline at end of file diff --git a/stable/_sources/procedures/index.rst.txt b/stable/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..c55898e8b --- /dev/null +++ b/stable/_sources/procedures/index.rst.txt @@ -0,0 +1,22 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Cloud Users Datadog integration + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Cloud Users Datadog integration ` +* :doc:`Datadog Integration ` +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/stable/_sources/procedures/updating-dashboard.rst.txt b/stable/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..5f6cd7075 --- /dev/null +++ b/stable/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,300 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 3 +pyyaml + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/stable/_sources/reference/index.rst.txt b/stable/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/stable/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/stable/_sources/reference/matrix.rst.txt b/stable/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..2a934441d --- /dev/null +++ b/stable/_sources/reference/matrix.rst.txt @@ -0,0 +1,165 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.7 + - 5.2, 5.4, 6.0 + - 2022.1, 2022.2, 2023.1, 2024.1 + - 1.7.0 + - 3.2 + * - 4.6 + - 5.2, 5.4 + - 2021.1, 2022.1, 2022.2, 2023.1, 2024.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/stable/_sources/reference/monitoring-apis.rst.txt b/stable/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/stable/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/stable/_sources/troubleshooting/index.rst.txt b/stable/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..fa1b25a10 --- /dev/null +++ b/stable/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,16 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* You can ask questions and discuss the ScyllaDB Monitoring Stack in the `ScyllaDB community forum `_ and on the `Slack channel `_. \ No newline at end of file diff --git a/stable/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/stable/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/stable/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/stable/_sources/upgrade/index.rst.txt b/stable/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/stable/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                                    +
                                    +
                                    +
                                    Upgrade Scylla Open Source
                                    +
                                    +
                                    + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                                    +
                                    +
                                    diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..95cec1d4e --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,150 @@ +====================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b +====================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y.b (The new version) +------------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip + unzip scylla-monitoring-4.y.b.zip + cd scylla-monitoring-scylla-monitoring-4.y.b/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the target files ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the port numbers +^^^^^^^^^^^^^^^^^^^^^^^^^ +ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent. + +Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target. + +.. caution:: + + As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics. + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x.a version that is currently running. + +Killing the new 4.y.b Monitoring stack in testing mode +------------------------------------------------------ + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y.b version while testing. + +Move to version 4.y.b (the new version) +--------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y.b Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x.a version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y.b in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y.b` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x.a +------------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y.b Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x.a/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/stable/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/stable/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/stable/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/stable/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..f86568a31 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,11 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/stable/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/stable/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/stable/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/stable/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/stable/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/stable/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/stable/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/stable/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/stable/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/stable/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/stable/_sources/use-monitoring/advisor/index.rst.txt b/stable/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..06fc98c5f --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,37 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/stable/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/stable/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/stable/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/stable/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/stable/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/stable/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/stable/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/stable/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/stable/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/stable/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/stable/_sources/use-monitoring/advisor/systemOverload.rst.txt b/stable/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..ac0b7d62f --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Queues are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/stable/_sources/use-monitoring/cql-optimization.rst.txt b/stable/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..7ac8b2284 --- /dev/null +++ b/stable/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,155 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +We strongly recommend using use the correct ordering. +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is supported, but not advisable. + + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/stable/_sources/use-monitoring/index.rst.txt b/stable/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/stable/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/stable/_static/basic.css b/stable/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/stable/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/stable/_static/check-solid.svg b/stable/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/stable/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/stable/_static/clipboard.min.js b/stable/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/stable/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/stable/_static/copybutton.css b/stable/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/stable/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                                    Short

                                    + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/stable/_static/copybutton.js b/stable/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/stable/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/stable/_static/copybutton_funcs.js b/stable/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/stable/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/stable/_static/css/main.css b/stable/_static/css/main.css new file mode 100644 index 000000000..78c7b8f6f --- /dev/null +++ b/stable/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{text-rendering:optimizeLegibility;font-size:inherit;line-height:1.6;margin-bottom:1rem}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{text-rendering:optimizeLegibility;color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{-webkit-print-color-adjust:economy;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.33333%}.grid-x>.small-2{width:16.66667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.33333%}.grid-x>.small-5{width:41.66667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.33333%}.grid-x>.small-8{width:66.66667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.33333%}.grid-x>.small-11{width:91.66667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.33333%}.grid-x>.medium-2{width:16.66667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.33333%}.grid-x>.medium-5{width:41.66667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.33333%}.grid-x>.medium-8{width:66.66667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.33333%}.grid-x>.medium-11{width:91.66667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.33333%}.grid-x>.large-2{width:16.66667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.33333%}.grid-x>.large-5{width:41.66667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.33333%}.grid-x>.large-8{width:66.66667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.33333%}.grid-x>.large-11{width:91.66667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.33333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.66667%}.small-up-7>.cell{width:14.28571%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.33333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.66667%}.medium-up-7>.cell{width:14.28571%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.33333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.66667%}.large-up-7>.cell{width:14.28571%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.33333%}.small-margin-collapse>.small-2{width:16.66667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.33333%}.small-margin-collapse>.small-5{width:41.66667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.33333%}.small-margin-collapse>.small-8{width:66.66667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.33333%}.small-margin-collapse>.small-11{width:91.66667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.33333%}.small-margin-collapse>.medium-2{width:16.66667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.33333%}.small-margin-collapse>.medium-5{width:41.66667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.33333%}.small-margin-collapse>.medium-8{width:66.66667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.33333%}.small-margin-collapse>.medium-11{width:91.66667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.33333%}.small-margin-collapse>.large-2{width:16.66667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.33333%}.small-margin-collapse>.large-5{width:41.66667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.33333%}.small-margin-collapse>.large-8{width:66.66667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.33333%}.small-margin-collapse>.large-11{width:91.66667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.33333%}.medium-margin-collapse>.small-2{width:16.66667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.33333%}.medium-margin-collapse>.small-5{width:41.66667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.33333%}.medium-margin-collapse>.small-8{width:66.66667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.33333%}.medium-margin-collapse>.small-11{width:91.66667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.33333%}.medium-margin-collapse>.medium-2{width:16.66667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.33333%}.medium-margin-collapse>.medium-5{width:41.66667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.33333%}.medium-margin-collapse>.medium-8{width:66.66667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.33333%}.medium-margin-collapse>.medium-11{width:91.66667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.33333%}.medium-margin-collapse>.large-2{width:16.66667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.33333%}.medium-margin-collapse>.large-5{width:41.66667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.33333%}.medium-margin-collapse>.large-8{width:66.66667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.33333%}.medium-margin-collapse>.large-11{width:91.66667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.33333%}.large-margin-collapse>.small-2{width:16.66667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.33333%}.large-margin-collapse>.small-5{width:41.66667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.33333%}.large-margin-collapse>.small-8{width:66.66667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.33333%}.large-margin-collapse>.small-11{width:91.66667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.33333%}.large-margin-collapse>.medium-2{width:16.66667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.33333%}.large-margin-collapse>.medium-5{width:41.66667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.33333%}.large-margin-collapse>.medium-8{width:66.66667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.33333%}.large-margin-collapse>.medium-11{width:91.66667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.33333%}.large-margin-collapse>.large-2{width:16.66667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.33333%}.large-margin-collapse>.large-5{width:41.66667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.33333%}.large-margin-collapse>.large-8{width:66.66667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.33333%}.large-margin-collapse>.large-11{width:91.66667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.33333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.66667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.33333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.66667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.33333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.66667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.33333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.66667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.33333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.66667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.33333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.66667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.33333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.66667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.33333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.66667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.33333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.66667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.33333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.66667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.33333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.66667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.33333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.66667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.33333%}.grid-y>.small-2{height:16.66667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.33333%}.grid-y>.small-5{height:41.66667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.33333%}.grid-y>.small-8{height:66.66667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.33333%}.grid-y>.small-11{height:91.66667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.33333%}.grid-y>.medium-2{height:16.66667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.33333%}.grid-y>.medium-5{height:41.66667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.33333%}.grid-y>.medium-8{height:66.66667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.33333%}.grid-y>.medium-11{height:91.66667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.33333%}.grid-y>.large-2{height:16.66667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.33333%}.grid-y>.large-5{height:41.66667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.33333%}.grid-y>.large-8{height:66.66667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.33333%}.grid-y>.large-11{height:91.66667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNjYgOS44MSAyLjYzIDExYTIuMDggMi4wOCAwIDAgMC0xLjEzIDEuODN2Ny44MWMuMTkgMS4xMS41IDEuNTMgMS41IDEuNDdNNy4wNiA5Ljk0bDEuNDQuOTQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0zLjUgMTguNXY1LjM0TTkuNSAxOC41djUuMzRNOC41NCAxOC40MnY1LjMzTTE1LjUgMTguNXY1LjM0TTE2LjUgMTguNXY1LjM0TTMuMzMgMjAuNTNoNS4wOE0xMS40NSA4Ljg0bC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMi4zNCAwaDAiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMi40MiA3LjVhMS44MSAxLjgxIDAgMCAxLTEuOTItMS43N1Y1YTEuOTQgMS45NCAwIDAgMSAxLjkyLTIgMi4wNyAyLjA3IDAgMCAxIDIuMDggMnYuNzdhMiAyIDAgMCAxLTIuMDggMS43M1pNMTEuNDIgOC43NCA5LjYzIDkuOWEyLjA3IDIuMDcgMCAwIDAtMS4xMyAxLjg1djcuODJBMS40NyAxLjQ3IDAgMCAwIDEwIDIxTTEzLjc1IDkuMThsMiAuNjVjLjcuMzUuNzYgMS4wNi43NiAxLjg0djcuOWMwIC43Ny0uMjMgMS4yNC0xIDEuMjQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik05LjkzIDE5LjVoNS40Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTkuNDIgOS4xMmEyLjA3IDIuMDcgMCAwIDAgMi4wOC0xLjkzdi0uNzdhMi4wNyAyLjA3IDAgMCAwLTIuMDgtMS45MiAxLjkzIDEuOTMgMCAwIDAtMS45MiAxLjkydi43N2ExLjk0IDEuOTQgMCAwIDAgMS45MiAxLjkzWk01LjU5IDkuMTJhMS45MyAxLjkzIDAgMCAwIDEuOTItMS45M3YtLjc3QTEuOTMgMS45MyAwIDAgMCA1LjU5IDQuNSAyLjA4IDIuMDggMCAwIDAgMy41IDYuNDJ2Ljc3YTIuMDggMi4wOCAwIDAgMCAyLjA5IDEuOTNaTTIwLjQ0IDkuODFsMiAxLjE3YTIuMDYgMi4wNiAwIDAgMSAxLjEzIDEuODV2Ny44MWMtLjE4IDEuMTEtLjQ3IDEuNTMtMS40NyAxLjQ3TTE4LjA0IDkuOTRsLTEuNDQuOTMiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yMS42IDE4LjV2NS4zNE0yMS43NyAyMC41M2gtNS4wOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjI4IDE5LjQ4Yy0uMTIuMDgtLjA4LjA3LS4yMy4xLS41OC4wOS0xLjEyLS4yOC0xLjI1LS44NCAwIDAtMi4zLTkuMTgtMi4zLTExLjExQzIuNSAzLjYgNS44OC40NCAxMC4zOC40NFMxNy41IDMuNDggMTcuNSA3LjVjMCAxLjkzLTEuMzIgMTEuMjMtMS4zMiAxMS4yMy0uMTMuNTYtLjY3Ljk0LTEuMjUuODQtLjEyLS4wMi0uMTMgMC0uMjMtLjA3Ii8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTEuNSA3YzAgMS45LTEuNTYgMy41LTMuNDYgMy41UzQuNSA4LjkgNC41IDdzMS42NC0zLjUgMy41NC0zLjVTMTEuNSA1LjEgMTEuNSA3WiIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNy41IDIuOTFjMCAxLjI4LTMuNjcgMi41OS04IDIuNTlzLTgtMS4zMS04LTIuNTlTNS4wOS41IDkuNDIuNXM4LjA4IDEuMTMgOC4wOCAyLjQxWk0xNy41IDcuNjZjMCAxLjI4LTMuNjMgMi44LTcuOTYgMi44UzEuNSA4LjkzIDEuNSA3LjY2TTE3LjUgMTIuNDdjMCAxLjI4LTMuNjcgMy4wMy04IDMuMDNzLTgtMS43NS04LTMuMDNNMTcuNSAxNy4yOWMwIDEuMjgtMy43NSAyLjMtOC4wOCAyLjNzLTcuOTItMS4wMy03LjkyLTIuM00xLjUgMTcuMTlWMi45MU0xNy41IDE3LjE5VjIuOTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjUgMS41aDIwdjE0SC41ek03LjUgMTUuNzR2Mi44OU0xMi44MyAxNS42M3YyLjMyTTUuNSAxOC41aDkuMTQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0zLjY0IDUuNTYgNC41OCAyLjkxLTQuNTggMi45Mk05LjEgMTIuMDhoNC4zMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS45IDEwLjI3YTEwLjgzIDEwLjgzIDAgMCAxIDguNzMtOC4zOE0xMC41MSAyMy4wOEExMC43OSAxMC43OSAwIDAgMSAxLjc3IDE0TTIzLjIzIDE0YTEwLjgxIDEwLjgxIDAgMCAxLTkgOS4xMU0xNC4yNyAxLjg4YTEwLjgxIDEwLjgxIDAgMCAxIDguODMgOC4zNyIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMTIuMjUiIGN5PSIxLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxMi4yNSIgY3k9IjIyLjc1IiByPSIxLjc1Ii8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGNsYXNzPSJjbHMtNSIgY3g9IjEuNzUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY2xhc3M9ImNscy01IiBjeD0iMjMuMjUiIGN5PSIxMi4yNSIgcj0iMS43NSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUxIDI0Ljkxdi01Ljg1TTEyLjU3IDI0Ljkxdi05Ljc0TTE5LjYyIDI0LjkxVjEwLjE1Ii8+PHBhdGggc3R5bGU9InN0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Im0uOTEgMTQuOTggNS4xMy03Ljk0IDYuMjUgNS44OEwyNCAxIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTI1IDUtNS01aDV2NXoiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOSAxNS0yLjUtMS41IDgtMTJMMTcgMyA5IDE1eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtNi41IDEzLjUtLjUgM0w5IDE1bC0yLjUtMS41eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjI1IDIuNWg0LjI1djE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41aDguMzFNMTQuNSAyLjVsMS42NyAxLjMzIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDExLjU1djhjMCAuNTYgMS4wNyAyIDIgMmgxOGMuODkgMCAyLTEuNDQgMi0ydi04Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjMuMzEgMy41SDEuODFjLS40OCAwLTEuMzEuNTUtMS4zMSAxdjZsMTAgMmE4LjQ1IDguNDUgMCAwIDAgNCAwbDEwLTJ2LTZjMC0uNDUtLjcyLTEtMS4xOS0xWk0xNS42MiAzLjV2LTFjMC0uNzYtLjYxLTEtMS4zOC0xaC0zLjQ1Yy0uNzYgMC0xLjM4LjI0LTEuMzggMXYxIi8+PHJlY3QgeD0iMTAiIHk9IjExIiB3aWR0aD0iNSIgaGVpZ2h0PSIzLjk5IiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIiBmaWxsPSIjMDAwIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMy40NCA0LjQ5SDkuNTF2MjRoMTl2LTI0SDI0LjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xMyAzLjQ5SDguNWwtLjA4IDI2LjFIMjkuNVYzLjM5SDI1Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNSAxOC4zOGgxM00xMi41IDE1LjQ5aDEzTTEyLjUgMjEuNDNoMTNNMTIuNSAyNC40N2gxM00xMy41IDIuNWgxMXYzLjk4aC0xMXoiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yMS41LjVoLTUuMDR2MS45NWw1LjA0LjA1di0yeiIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSIxMC41IiBjeT0iOS41IiByPSI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTAuNSAzLjV2NmwzLjA2IDMiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMzQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIiBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNDIuNTQgNC4wNmMwIDEuNjgtMy42MyAyLjQ0LTkgMi40NHMtMTAtLjczLTEwLTIuNFMyNy42Ny41IDMzLjA0LjVzOS41IDEuODkgOS41IDMuNTZaTTQyLjU0IDkuNjNjMCAxLjY4LTMuNzYgMi45MS05LjEyIDIuOTFzLTkuODQtMS4yMy05Ljg0LTIuOTFNNDIuNTQgMTUuMzRjMCAxLjY4LTMuNjggMy4yNS05LjA0IDMuMjUtNCAwLTcuNi0uOTYtOS4wOS0yLjA0TTQyLjU0IDIwLjY1YzAgMS42OC0zLjcyIDIuOTctOS4wOCAyLjk3TTIzLjU0IDE1LjQ2VjQuMU00Mi41NCAyMC43N1Y0LjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4xMSAyMS4wOGMtLjg3IDAtMS42Ny4yMy0yLjM5LjYxIDAtLjA3LjAxLS4xNC4wMS0uMjEgMC00Ljg1LTMuODMtOC45LTguNjgtOC45cy04Ljg4IDQuMDUtOC44OCA4LjljMCAuMTcuMDIuMzQuMDMuNTEtLjg0LS41Ny0xLjg1LS45MS0yLjk1LS45MS0yLjg4IDAtNC43NCAyLjU3LTQuNzQgNS40NnMxLjg2IDQuOTkgNC43NCA0Ljk5aDIyLjg2YzIuODggMCA1LjUyLTIuMjcgNS41Mi01LjE2cy0yLjYzLTUuMjktNS41Mi01LjI5WiIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDExLjVoOHYxaC04ek0xNS42NSA2LjU1YTMuNDIgMy40MiAwIDAgMC0zLjE1IDIiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNSAxMy42M3YyLjg4aDYuMDZNMjAuNSAxMy41NHYyLjk2bC01LjUuMDEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMi41IDE4LjV2Mi43Mk03LjUgMjEuNWgxMCIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMDYgMTMuNThIMy44OEEzLjEgMy4xIDAgMCAxIC41IDEwLjVoOGEzLjE2IDMuMTYgMCAwIDEtMy40NCAzLjA4Wk0yMSAxMy41OGgtMS4xN2EzLjA5IDMuMDkgMCAwIDEtMy4zNy0zLjA3aDhBMy4xNiAzLjE2IDAgMCAxIDIxIDEzLjU4Wk03LjQ2IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZTMS41OCA1LjYgMS41OCA1IDMgNC40IDQuNjkgNC40czIuNzcuMTYgMi43Ny43MlpNMS41IDkuODVWNS4zMU03LjUgMTAuMzVWNS44MU0yMy41IDUuMTJjMCAuNTctMS4xLjQ2LTIuNzkuNDZzLTMuMDkgMC0zLjA5LS41NFMxOSA0LjQgMjAuNzMgNC40czIuNzcuMTYgMi43Ny43MlpNMTcuNTQgOS44NVY1LjMxTTIzLjU0IDEwLjM1VjUuODEiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIHRyYW5zZm9ybT0icm90YXRlKC0yNy40OSAxNS41NTIgMTEuMDgzKSIgZD0iTTcuNzYgNi4wMWgxNS41OXYxMC4xM0g3Ljc2eiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTYuMyAxMC4xOCA4LjYzIDEuNTZhMS40MiAxLjQyIDAgMCAwIDEuNTMtLjc0bDMuNjctOE0xMS4wMiAxOS4wM2wxLjc0LTVNMjQuNTkgMTEuOTdsLTUuMDktMS40NU03LjA5IDE3LjU4IDMuOSAxOS4zNE02LjA2IDE1LjQxLjU0IDE4LjM2Ii8+PC9zdmc+)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjQ4IDEwLjU5LS41LjE3LjUuMTZMMTEgMTIuMTZWMTRsLTctMi40OVYxMGw3LTIuNXYxLjgzWk0xNCA5LjMyVjcuNWw3IDIuNXYxLjU0TDE0IDE0di0xLjgzbDQuMTQtMS4zLjQ0LS4xMy0uNDMtLjE0WiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOThweCIgZD0iTTEuNSAyLjVoMjJ2MTZoLTEzdjQuMTdMNi40NiAxOC41bC00Ljk2LS4wNFYyLjV6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0zLjUgMi41MWgxNi45NHYyMC45MUgzLjV6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjIuNDUgMjEuNS4wNS0yMWgtMTdhMi4xNiAyLjE2IDAgMCAwLTIgMiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTYgNmg3djJINnpNNiA5aDExdjJINnoiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTMuNjIgNy41IDEuODgtMS4wOCAyIDIuMDh2N2gxTTE1LjUgMTUuNXYtNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTUuNSAxNS41di0xMmw0LTIgNCAydjEyTTkuNSAxNS41VjEuNk03LjUgNS41djEwTTExLjUgNS41djEwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS41IDguNTQgMy40NiA3LjVsLTEuOTYuOTZ2Ny4wNGgtMU0zLjUgMTAuNXY1TS41IDE3LjVoMTgiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgNDMgMzEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQzIDMxIiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yMi41IDIzLjVoLTIxdi0yMGgyMnYxNS4yMSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQuNDIgMy41YzAtMS4zNiAxLjA5LTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTEwLjY3IDMuNWMwLTEuMzYgMS4xLTIgMi40Ni0yYTIuNDYgMi40NiAwIDAgMSAwIDQuOTEgMi42MSAyLjYxIDAgMCAxLTEtLjIxTTE2LjkzIDMuNWMwLTEuMzYgMS4xLTIgMi40NS0yYTIuNDYgMi40NiAwIDEgMSAwIDQuOTEgMi41MiAyLjUyIDAgMCAxLTEtLjIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNyA5aDN2M0g3ek0xMiA5aDN2M2gtM3pNMTcgOWgzdjNoLTN6TTcgMTRoM3YzSDd6TTEyIDE0aDN2M2gtM3pNMTcgMTRoM3YzaC0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSAzLjY3djE2LjY2TTMuNSAyMC40M2MwIDEuMjkuNDQgMi4zMyAxLjczIDIuMzNzMi4zMy0xLjkgMi4zMy0zLjE5bDE2Ljk0LS4wN2MwIDEuMjktLjU1IDMuMTItMS44MyAzLjEySDYuMyIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjEiIHk9IjEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+PHBhdGggZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYuMDAxIiBoZWlnaHQ9IjE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTMuNSA2LjE0djExYTEuMzggMS4zOCAwIDAgMCAxLjM3IDEuMzZoMTEuMjZhMS4zOCAxLjM4IDAgMCAwIDEuMzctMS4zN3YtMTEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xOS41IDcuNS04LTYuMjVhMS41OSAxLjU5IDAgMCAwLTEuOTQgMEwxLjUgNy41TTEyLjczIDE4LjAydi03LjIxSDguMjd2Ny4yMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIvPjxyZWN0IHg9IjEuNSIgeT0iLjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMi41IDIuNWgxM3YxNmgtMTN6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuNTggMTcuMjFoMS45MlYuNWgtMTNhMi4zNCAyLjM0IDAgMCAwLTIgMiIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xMiAyLjVINi41VjZjMCAzIC41NSA3LjE3IDUgOS41djQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02LjQgNC40NGgtNFMyLjU2IDExIDguNSAxM00xOC41IDQuNWw0LS4wNnMtLjA2IDYuNTYtNiA4LjU2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTIgMi41aDYuNVY2YzAgMi45NC0uNCA3LjA4LTUgOS41djRNOS41IDE5LjVoNnYyaC02eiIvPjxwYXRoIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQuNTYgMTIuNy0xLjI1LTEuNTctMS4zMS43NmE2IDYgMCAwIDAtMS42NS0xbC4wOC0xLjQ5LTItLjQtLjUzIDEuNDRhNS43MyA1LjczIDAgMCAwLTEuODcuMzFsLS44OC0xLjE5LTEuNzcgMUwzLjkyIDEyYTYuMyA2LjMgMCAwIDAtMS4yMiAxLjQxbC0xLjUtLjM1LS43NCAxLjg3IDEuMzguOGE2LjIzIDYuMjMgMCAwIDAgMCAxLjgzbC0xLjQxLjcyLjY0IDEuOTEgMS41OS0uMjhhNy42MyA3LjYzIDAgMCAwIC40OC42OCA1Ljg2IDUuODYgMCAwIDAgLjY3LjczbC0uNjIgMS40NiAxLjcyIDEgMS0xLjI0YTYuNDYgNi40NiAwIDAgMCAxLjc5LjM1bC40NiAxLjUyIDItLjN2LTEuNmE2LjQzIDYuNDMgMCAwIDAgMS42Mi0uODlsMS4zLjg1TDE0LjQzIDIxbC0xLTEuMmE2LjI0IDYuMjQgMCAwIDAgLjY4LTEuNzVsMS41MS0uMTkuMDUtMi0xLjUxLS4yNmE2LjA3IDYuMDcgMCAwIDAtLjYyLTEuODFabS01LjM1IDUuNTFhMS45MyAxLjkzIDAgMSAxIC4zMS0yLjcxIDEuOTIgMS45MiAwIDAgMS0uMzEgMi43MVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0yNC4zMSA4LjA1LS4xMy0xLjY1LTEuMjUtLjA5YTUuMjYgNS4yNiAwIDAgMC0uNjctMS40NGwuNzUtMS0xLjE2LTEuMTctMSAuNzRhNS4xOCA1LjE4IDAgMCAwLTEuNDMtLjY2bC0uMDYtMS4yNC0xLjY1LS4xNy0uMzIgMS4yNWE1Ljc3IDUuNzcgMCAwIDAtMS41Mi4zOEwxNSAyLjFsLTEuMzcuOS41OCAxLjE4YTQuODggNC44OCAwIDAgMC0uODYgMS4yNWwtMS4zLS4xNi0uNDUgMS42IDEuMjIuNTVhNS4xNyA1LjE3IDAgMCAwIDAgLjY4QTQuMjggNC4yOCAwIDAgMCAxMyA5bC0xLjExLjcyLjY5IDEuNTEgMS4yOC0uMzdhNC45NCA0Ljk0IDAgMCAwIDEuMDcgMS4wN2wtLjM5IDEuMjYgMS41LjcxLjc0LTEuMDlhNS4wNyA1LjA3IDAgMCAwIDEuNTIuMTRsLjUgMS4xOSAxLjYxLS40MS0uMTMtMS4yOWE1LjE0IDUuMTQgMCAwIDAgMS4yNy0uODhsMS4xMi41NyAxLTEuMzUtLjkxLS44OGE0LjkgNC45IDAgMCAwIC40Mi0xLjUyWm0tNi4yIDEuNDNhMS43NCAxLjc0IDAgMSAxIDEuNi0xLjg2IDEuNzQgMS43NCAwIDAgMS0xLjYgMS44NloiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LjIxIDYuMzhhNS4zNiA1LjM2IDAgMCAxLTEuNTEgMy43MyA1IDUgMCAwIDAtMS40NSAzLjMxSDguNDdhNS40MSA1LjQxIDAgMCAwLTEuMjgtMy4xMSA1LjM3IDUuMzcgMCAxIDEgOS0zLjkzWk0xMy4yMyAxNS42N0g4LjQ1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTMuMjQgMTMuNGgtNC44djQuMTZhLjcuNyAwIDAgMCAuNzEuN2gzLjM4YS43LjcgMCAwIDAgLjcxLS43WiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTEwLjg0IDguMjFhMS42NSAxLjY1IDAgMSAxIDEuNjQtMS42NSAxLjY1IDEuNjUgMCAwIDEtMS42NCAxLjY1Wk0xMC44NCA4LjY3djQuNjQiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMCAuNWg1djJoLTV6Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDoxLjExcHg7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMTNweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiIGQ9Ik0xMiA2VjIuNSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wOHB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEzIDZWMi41Ii8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNMTIuNSA4LjA2VjEwTTEyLjUgMjAuMDR2MS44OE03LjEzIDEwLjA4bDEuNzkgMS44OE0xNi4wNCAxNy4wOGwyIDEuODhNNyAxOC45MmwxLjg4LTEuODhNMTYuMTMgMTEuOTZsMS43OS0xLjgzIi8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTYiIGQ9Im0xMi42MyAxNC41NCAyLjUgNi4zOCIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMTggMmg1djIySDNWMmg0LjkyIiBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4wN3B4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiIGQ9Ik04IDBoMTB2NEg4eiIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTcgOWgzdjNIN3pNNyAxNmgzdjNIN3oiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0xMi41IDkuNWg3djJoLTd6TTEyLjUgMTYuNWg3djJoLTd6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iNS41IiB5PSI1LjUiIHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOS41IDkuNWg3djdoLTd6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNOC41IDUuNXYtNE0xMS41IDUuNXYtNE0xNC41IDUuNXYtNE0xNy41IDUuNXYtNE04LjUgMjQuNXYtNE0xMS41IDI0LjV2LTRNMTQuNSAyNC41di00TTE3LjUgMjQuNXYtNE0yMC41IDguNWg0TTIwLjUgMTEuNWg0TTIwLjUgMTQuNWg0TTIwLjUgMTcuNWg0TTEuNSA4LjVoNE0xLjUgMTEuNWg0TTEuNSAxNC41aDRNMS41IDE3LjVoNCIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHg9IjE3LjYzIiB5PSIxNC4wMSIgd2lkdGg9IjMuMDUiIGhlaWdodD0iMTAuOCIgcng9Ii41NyIgcnk9Ii41NyIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDE5LjE1OCAxOS40MDUpIiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2U6Z3JheSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjUiIGN5PSIzIiByPSIyLjUiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjE5IiBjeT0iMjAiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iMjIiIGN5PSI2LjYiIHI9IjIuNSIvPjxjaXJjbGUgY2xhc3M9ImNscy0yIiBjeD0iNC41IiBjeT0iMjIiIHI9IjIuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0ibTYuODMgNS41IDMuMjUgNC4zM00yMC4yMyA3Ljg1IDE1LjMzIDExTTkuODMgMTUuMDhsLTQuMDkgNS44NE0xNC41OCAxNS4zM2wzIDMuMDkiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMyAxNS4xNyAxNi4zMSAzLjgyYTEuNDggMS40OCAwIDAgMSAyLjIyLjQ2bDUuMTUgOS42NWExLjQ2IDEuNDYgMCAwIDEtLjkzIDIuMTJMNS42OSAxOS45Wk04LjcxIDE5LjMzbC43NiAyLjIyYTEuNTEgMS41MSAwIDAgMCAxLjg1IDFsMy41OC0xLjA2YTEuNSAxLjUgMCAwIDAgMS0xLjg2TDE1LjQ1IDE4TTUuNTQgMjBsLTEuODMgMWEuOTIuOTIgMCAwIDEtMS4yNS0uMzdMLjYxIDE3LjQ5QS45Mi45MiAwIDAgMSAxIDE2LjI0bDEuODMtMU04LjUgMTRsNy4zOC01LjUiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE5LjUgOS41aDN2MTJoLTIwdi0xMmgzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMi42NSA5Ljg0IDkuODUgNi44OCA4LjYzLTYuODgiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Im01LjUgNy41LTMgMk0xNC4zNSAzLjg2bC0xLjQ2LTEuMDktMS40NyAxLjA5TTIxLjUgOS41bC0yLTJNMTkuNSAxMS41di03aC0xNHY3LjQ3Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3QgeD0iNC4zNyIgeT0iMTMuNzEiIHdpZHRoPSIxLjE1IiBoZWlnaHQ9IjkuNzIiIHJ4PSIuNTQiIHJ5PSIuNTQiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQuOTQ4IDE4LjU3KSIgc3R5bGU9InN0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6MS4wOXB4Ii8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBzdHlsZT0ic3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiIGQ9Ik04LjUgMjAuNXYzaDE1di0yMWgtMTV2MiIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0uMzEgMjEuNTEgNSAxOS42OWEyLjM3IDIuMzcgMCAwIDEgMS44OC4xOWw1LjI0IDEuNjhhMi4yMyAyLjIzIDAgMCAwIDItLjEybDkuNS00Ljc1Yy44LS40NCAxLjY0LTEuMzEgMS4xMy0xLjkxYTIuMzQgMi4zNCAwIDAgMC0yLjY0LS40MkwxOCAxNi4wOSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibS4yNSAxNS42OSA0Ljg4LTEuMjFjMS4yNS0uMyAyLjE3LS42MyAzLjQ0LS4xM2ExNS4yMSAxNS4yMSAwIDAgMCA0IDEuMWg0LjUyYy44NSAwIC45NS41NC45NSAxLjEzYTEgMSAwIDAgMS0xLjA4IDEgNjUuODYgNjUuODYgMCAwIDEtNy0uMzEiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04LjU2IDkuNjh2LS44MWMwLS45MS0uMzgtMS4yMS0xLjI5LTEuMjFIN1Y2LjNoLjMxYy45MSAwIDEuMjktLjMgMS4yOS0xLjIxdi0uODFjMC0xLjIuNjYtMS45MiAyLjgyLTIuM3YxLjE2Yy0xLjI0LjM1LTEuNDMuNjgtMS40MyAxLjR2Ljg3QTEuNTIgMS41MiAwIDAgMSA4Ljc1IDcgMS41MiAxLjUyIDAgMCAxIDEwIDguNTZ2Ljg3YzAgLjcxLjE5IDEgMS40MyAxLjRWMTJjLTIuMjEtLjM1LTIuODctMS4xMi0yLjg3LTIuMzJaTTE3LjQzIDQuM3YuODFjMCAuOTEuMzcgMS4yMSAxLjI5IDEuMjFIMTl2MS4zNmgtLjMxYy0uOTIgMC0xLjI5LjMtMS4yOSAxLjIxdi44MWMwIDEuMi0uNjUgMi0yLjgxIDIuMzV2LTEuMmMxLjI1LS4zNiAxLjQ0LS42OSAxLjQ0LTEuNHYtLjg3QTEuNTMgMS41MyAwIDAgMSAxNy4yNSA3IDEuNTMgMS41MyAwIDAgMSAxNiA1LjQzdi0uODdjMC0uNzItLjE5LTEtMS40NC0xLjRWMmMyLjIyLjM4IDIuODcgMS4xIDIuODcgMi4zWiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIgZGF0YS1uYW1lPSJDYWxxdWUgMiIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMjIuNjEgMy40NUMyMi42MSA1LjA2IDE4IDYuNSAxMi41IDYuNXMtMTAtMS40NC0xMC0zIDQuNS0zIDEwLTMgMTAuMTEgMS4zMyAxMC4xMSAyLjk1Wk0yMi42MSA5LjQ0YzAgMS42MS00LjY0IDMuMDYtMTAuMTEgMy4wNnMtMTAtMS40NS0xMC0zLjA2TTIyLjYxIDE1LjUxYzAgMS42Mi00LjY0IDMtMTAuMTEgM3MtMTAtMS4zNy0xMC0zTTIyLjYxIDIxLjU5YzAgMS42Mi00LjY0IDIuOTEtMTAuMTEgMi45MXMtMTAtMS4yOS0xMC0yLjkxTTIuNSAyMS40N1YzLjQ1TTIyLjUgMjEuNDdWMy40NSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguNSA4LjI2aC00LjcybC0xLjIzIDEuMjdNMi4zOSAxNS4wOS4xNSAxMy43NGw0Ljg3LTguNDIgMi4yNCAxLjM0LTQuODcgOC40M3pNMjIuNTkgMTUuMDlsMi4yNC0xLjM1LTQuODYtOC40Mi0yLjI0IDEuMzQgNC44NiA4LjQzek0xMC43MSAxNS4yNmwtMi45MyAyLjIxTTEyLjE4IDE2LjRsLTIuOTMgMi4yMU0xMy42OCAxNy41M2wtMi45MyAyLjIyIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi4zOCA4LjNoMy43OGEyLjI3IDIuMjcgMCAwIDEgMS4zNy40N2MxLjI2IDEgNC4wOSAzLjE4IDQuNDggMy41NnMtMS4xNCAxLjY4LTIuMjcgMS4xYTE4LjM0IDE4LjM0IDAgMCAwLTIuMTEtLjkyLjU3LjU3IDAgMCAwLS41Ni4wOWwtNC43OSAzLjg5TDEyLjMzIDIxbDkuNDYtNy4wOU0zLjI0IDE0LjIybDMuNCAxLjg1Ii8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiByeD0iMSIgZmlsbD0iI0IzQkFDNSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS41IDVhMSAxIDAgMSAwLTIgMHYyLjVINWExIDEgMCAxIDAgMCAyaDIuNVYxMmExIDEgMCAxIDAgMiAwVjkuNUgxMmExIDEgMCAxIDAgMC0ySDkuNVY1WiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMjEuNzMgNy0yLjQxLTUuMTJhMi41MiAyLjUyIDAgMCAwLTIuODItMWwtNi4wOCAyLjA0QTEuNjkgMS42OSAwIDAgMCA5LjUxIDRMMy45MyAxOS4yOWExLjA2IDEuMDYgMCAwIDAgLjY0IDEuMTdsMTAuMzQgMy43NmExIDEgMCAwIDAgMS4yMi0uNDNsNS41OC0xNS4zM0ExLjg3IDEuODcgMCAwIDAgMjEuNzMgN1oiLz48Y2lyY2xlIGNsYXNzPSJjbHMtMSIgY3g9IjE1LjczIiBjeT0iNS44OSIgcj0iMiIvPjx0ZXh0IHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIiBzdHlsZT0iZm9udC1zaXplOjEycHg7ZmlsbDpncmF5O2ZvbnQtZmFtaWx5OlJvYm90by1NZWRpdW0sUm9ib3RvIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjEuNSAyNC41aC0xN1Y1LjdMOC45NS41NCAyMS41LjV2MjR6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNC42NSA1LjVIOS41VjFNNy41IDguNWgxMU03LjUgMTEuNWgxMU03LjUgMTQuNWgxMU03LjUgMTcuNWgxMU03LjUgMjAuNWgxMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01LjUgMi41aDYuOTFsLjA5IDIwaC03di0yMHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik04IDRoMnYxMC45N0w4IDE1VjR6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNS4zNiAyLjI5IDIuNSAzLjV2MThsMi43OSAxLjE0Ii8+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouNjhweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJtMTIuNTcgMjEuODYgMS41Ny43NSIvPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljg1cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIgZD0ibTE0LjExIDIuNS0xLjU0LjU3Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSI5IiBjeT0iMTkiIHI9IjEiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC41IDIuNWg2Ljk0bC4wNiAyMGgtN3YtMjB6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTcgNGgydjEwLjk3TDE3IDE1VjR6Ii8+PGNpcmNsZSBjbGFzcz0iY2xzLTIiIGN4PSIxOCIgY3k9IjE5IiByPSIxIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMTIuNiAyLjczaDEuNjdWMjIuNkgxMi42ek0yLjU4IDIxLjVsMi43NSAxLjFWMi43M2wtMi42Ni45NC0uMDkgMTcuODN6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtLjUgNC41IDgtMyA4IDQgOC0zdjE3bC04IDMtOC00LTggM3YtMTd6TTguNSAxLjVWMThNMTYuNSA1LjVWMjIiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0yLjUgMTMgNyAxNi41TTcgMTJsLTQuNSA1LjVNMTguNSA4bDQuNSAzLjVNMjMgN2wtNC41IDUuNSIvPjxwYXRoIGNsYXNzPSJjbHMtMyIgZD0iTTEwIDEzaDF2MWgtMXpNMTIgMTJoMXYxaC0xek0xNCAxMWgxdjFoLTF6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMzEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0yMS45NDkuMTEzIDIuMDQzIDExLjY3LTIuNTE0LjQzMkwxOS40MzUuNTQ1IDIxLjk1LjExNFptLTE3Ljk3MyAyNiAxMS45NDUtLjAwNS0uMDAyLTIuNTMtMTEuOTQ0LjAwNi4wMDEgMi41M1ptMTIuMjMyLTUuNzc3TDQuMzE1IDE5LjI1bC0uMjM1IDIuNTIgMTEuODk0IDEuMDg1LjIzNC0yLjUxOVptLTEwLjc1LTYuMzc1IDExLjUzNSAzLjA3NC0uNjYyIDIuNDQzLTExLjUzNS0zLjA3NS42NjItMi40NDJabTEzLjA0LjE4TDguMjEyIDguMTI2bC0xLjI5NyAyLjE3OCAxMC4yODkgNi4wMTcgMS4yOTYtMi4xNzhabS00LjIwNi0xMS41NiA2LjczIDkuNzg3LTIuMTA4IDEuNDI0LTYuNzMtOS43ODUgMi4xMDgtMS40MjVaIiBmaWxsPSIjMDAwIi8+PHBhdGggZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTYuNSAyMiAxLTYuNS0xMCAuMDMgMSA2LjQzIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xNC42MiA1YTIuMzMgMi4zMyAwIDAgMS0yLjI1IDIuNWMtMS4zMyAwLTItMS4xMi0xLjk1LTIuNDRzLjctMi41IDItMi40OEEyLjI3IDIuMjcgMCAwIDEgMTQuNjIgNVpNMTcuNTggMTJhMy4yMyAzLjIzIDAgMCAwLTMuNDYtMy41SDExQTMuMjYgMy4yNiAwIDAgMCA3LjUgMTIiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNy41NCAxOC41SDQuNWwtMi02aDIwbC0yIDZoLTMiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTguMTkgNy41YTEwIDEwIDAgMCAxIC4yMSAyLjA3YzAgNC4zNi0yLjYzIDYuOTMtNS45IDYuOTNzLTUuOTQtMi41Ny01Ljk0LTYuOTNhMTAuNTEgMTAuNTEgMCAwIDEgLjIyLTIuMTIiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik03LjY3IDIuMjNBNi41OCA2LjU4IDAgMCAxIDEyLjUuNWE1LjY1IDUuNjUgMCAwIDEgNC4yOSAxLjdjMS45MyAxLjk0IDIuMzUgNS4wNyAyLjQzIDYuNzJhMS40OSAxLjQ5IDAgMCAwLS43OS4wNSA4LjY4IDguNjggMCAwIDAtLjA4LTEuMTZoMGE1LjUzIDUuNTMgMCAwIDEtMS43Ny0yLjM0TDE2LjQ5IDVsLS4zOC4yMkExOSAxOSAwIDAgMSA2LjggNy4zOGEuNTIuNTIgMCAwIDAtLjQyLjE2Yy0uMjMuMjQtLjE1LjY1LS4wNyAxLjA4IDAgLjExIDAgLjIyLjA1LjMyYTEuNCAxLjQgMCAwIDAtLjU4IDBjLS4xLTEuNDUtLjA2LTQuNjggMS44OS02LjcxWk02LjM4IDljLS42NS0uMDgtMSAuMS0xLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMCAxLjM3IDIuMjlNMTguNTYgOWMuNjUtLjA4IDEuMDUuMSAxLjE0Ljc5YTIuMDYgMi4wNiAwIDAgMS0xLjM3IDIuMjlNOS41IDE4LjIzVjE1LjVNMTUuNSAxNS41djIuNzNNMi41IDI0LjE2Yy4yNC0yIC41OS0zLjYzIDIuNDMtNC40OWEyNC4yOSAyNC4yOSAwIDAgMSA0LjgyLTEuMzdNMjIuNSAyNC4zM2MtLjI0LTItLjQyLTMuOC0yLjI2LTQuNjZhMjQuMjkgMjQuMjkgMCAwIDAtNC44Mi0xLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTUuMzkgMTguMzlhNC4zNyA0LjM3IDAgMCAxLTIuOTEgMS4wNyA0LjQyIDQuNDIgMCAwIDEtMi44OS0xLjA1Ii8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTExIDEzaDN2MmgtM3oiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNOC4zOSA0LjVIMjMuNXYxM2gtMTUiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0xLjUgOS41aDJsLjguODYuNy0uODZoNS41OGExIDEgMCAxIDEgMCAySDYuNXYxMC44OGExIDEgMCAwIDEtMSAxLjEyIDEgMSAwIDAgMS0xLTEgMSAxIDAgMCAxLTEgMSAuOTMuOTMgMCAwIDEtMS0xdi02Yy0uNzggMC0yLS40Ny0yLTF2LTVhMSAxIDAgMCAxIDEtMVoiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNi41IDYuNWgxMnYxMmgtMTJ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNC41IDQuNWgxNnYxNmgtMTZ6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOC41IDEwLjUgNSA1IDExLTEyIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIiBmaWxsPSIjZmZmIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMTcuNSAxNS41SC41di0xM2gxOE01LjUgMjVsNC00LjMgNCA0LjMiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTIzLjQxIDcuNWgtMS41MkwyMSA5bC0uOS0xLjVIMTNBMS44IDEuOCAwIDAgMCAxMS41IDlhMS44IDEuOCAwIDAgMCAxLjUgMS41aDQuNXYxMy4yNEExLjQxIDEuNDEgMCAwIDAgMTkgMjVhMS40MiAxLjQyIDAgMCAwIDEuNS0xLjIyIDEuNTMgMS41MyAwIDAgMCAzIDB2LTcuMTFhMS4xMSAxLjExIDAgMCAwIDEuMDktMS4xOFY4LjY3YTEuMTggMS4xOCAwIDAgMC0xLjE4LTEuMTdaTTkuNSAxNS40NHY1LjM4Ii8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibTAgMCA1IDUgNS01SDBaIiBmaWxsPSIjM0EyRDU1Ii8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMS41IDguNSAxMS00IDExIDR2M2wtMTEgNC0xMS00di0zeiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTUuNSAxMi41djVhMTIuNDYgMTIuNDYgMCAwIDAgNyAyIDExLjIgMTEuMiAwIDAgMCA3LTJ2LTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMy41IDkuNSA4IDEuMjN2OC43N00yMi41IDE2LjV2MyIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDouOThweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiBkPSJNMjMuNSAyLjVoLTIydjE2aDEzdjQuMTdsNC4wNC00LjE3IDQuOTYtLjA0VjIuNXoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xMC44NSA4QTEwLjM4IDEwLjM4IDAgMCAxIDExIDkuNWMwIDIuNDctMS4yMSA0LTMgNHMtMy41LTItMy41LTQuNWE0LjE4IDQuMTggMCAwIDEgMC0xIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNS4yIDUuMDdhMy4yMiAzLjIyIDAgMCAxIDIuNS0xIDMuMTYgMy4xNiAwIDAgMSAyLjQgMSA2LjIyIDYuMjIgMCAwIDEgMS4zIDMuODEuNzQuNzQgMCAwIDAtLjQyIDBjMC0uMjQgMC0uNDQtLjA1LS42NmgwQTMgMyAwIDAgMSAxMCA2Ljl2LS4yNGwtLjIxLjEyQTkuNjIgOS42MiAwIDAgMSA0LjczIDhhLjI1LjI1IDAgMCAwLS4yMi4wOWMtLjEzLjE0LS4wOS4zNyAwIC42MXYuMThhLjg1Ljg1IDAgMCAwLS4zMiAwQTUuMzcgNS4zNyAwIDAgMSA1LjIgNS4wN1pNNC41MSA4LjkzYy0uMzUgMC0uNTcuMDUtLjYxLjQ0YTEuMTcgMS4xNyAwIDAgMCAuNzMgMS4zTTExIDguOTNjLjM2IDAgLjU3LjA1LjYyLjQ0YTEuMTcgMS4xNyAwIDAgMS0uNzQgMS4zTTYuMzEgMTQuMTN2LS44NE05LjI1IDEzLjE5di45NE0yLjQyIDE4Yy4xMy0xLjE1LjU4LTIuNTIgMS41OC0zYTE0LjcxIDE0LjcxIDAgMCAxIDIuMzEtLjgyTTEzLjUgMThjLS4xMy0xLjE1LS41MS0yLjUyLTEuNS0zcy0yLjUtMS0yLjUtMSIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuMzQgMTQuMjJhMi4yMyAyLjIzIDAgMCAxLTEuNTYuNjEgMi4zMiAyLjMyIDAgMCAxLTEuNTUtLjU5TTIxLjUgNi41aC03TTIxLjUgOS41aC03TTE4LjUgMTIuNWgtNCIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSI+PHBhdGggZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIiBmaWxsPSIjMDYxOTM4Ii8+PHBhdGggZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIiBmaWxsPSIjMDYxOTM4Ii8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIgZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTkuNDcgMjAuNXYxLjg4TTE1LjUgMjAuNXYyTTYuNSAyMi41aDEyIi8+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggc3R5bGU9ImZpbGw6Z3JheSIgZD0iTTggOWg4djJIOHoiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik0xNC4wNiAxLjUgMy41IDEuNTJWMjMuNWgxN1Y3bC02LjQ0LTUuNXoiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNNi41IDE5LjVoNE0xMy41IDE5LjVoNE02LjUgMTYuNWg0TTEzLjUgMTYuNWg0TTYuNSAxMy41aDRNMTMuNSAxMy41aDQiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMS41IDUuNWgyMnYxNGgtMjJ6Ii8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJtOS41IDE5LjUtLjAzIDIuODhNMTUuNSAxOS41djNNNi41IDIyLjVoMTIiLz48cGF0aCBzdHlsZT0iZmlsbDojNGQ0ZDRkIiBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNi40NyAxMS4zNCAzLjM3IDQuMjgiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__title a{color:#23263b;text-decoration:none}.side-nav__title a:hover{font-weight:700}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button--bold{border-width:2px;font-weight:700}.hero__button .icon{margin-right:5px}.hero__button .icon--right{margin-left:5px;margin-right:0}.hero__button .icon--link,.hero__cta{color:#3c4fe0}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWFzayBpZD0iYSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2EpIiBmaWxsPSIjNTA2NEFFIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/stable/_static/doctools.js b/stable/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/stable/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/stable/_static/documentation_options.js b/stable/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/stable/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/stable/_static/file.png b/stable/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/stable/_static/file.png differ diff --git a/stable/_static/img/banner-background.svg b/stable/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/stable/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stable/_static/img/favicon-228x228.png b/stable/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/stable/_static/img/favicon-228x228.png differ diff --git a/stable/_static/img/favicon-32x32.png b/stable/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/stable/_static/img/favicon-32x32.png differ diff --git a/stable/_static/img/favicon.ico b/stable/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/stable/_static/img/favicon.ico differ diff --git a/stable/_static/img/icons/icon-about-team.svg b/stable/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/stable/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/stable/_static/img/icons/icon-about-us-m.svg b/stable/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/stable/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-about-us.svg b/stable/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/stable/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-alternator.svg b/stable/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/stable/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-apps.svg b/stable/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/stable/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-architecture.svg b/stable/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/stable/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/stable/_static/img/icons/icon-benchmarks.svg b/stable/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/stable/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/stable/_static/img/icons/icon-blog.svg b/stable/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/stable/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/stable/_static/img/icons/icon-careers.svg b/stable/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/stable/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/stable/_static/img/icons/icon-chevron-left.svg b/stable/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/stable/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/icons/icon-chevron-right.svg b/stable/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/stable/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/icons/icon-circe.svg b/stable/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/stable/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-clock.svg b/stable/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/stable/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-close.svg b/stable/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/stable/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-cloud-docs.svg b/stable/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/stable/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-cloud.svg b/stable/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/stable/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-comparison.svg b/stable/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/stable/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/stable/_static/img/icons/icon-contact-us.svg b/stable/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/stable/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/stable/_static/img/icons/icon-developers-blog.svg b/stable/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/stable/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/stable/_static/img/icons/icon-docs.svg b/stable/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/stable/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/stable/_static/img/icons/icon-enterprise-m.svg b/stable/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/stable/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-enterprise.svg b/stable/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/stable/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-events.svg b/stable/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/stable/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/stable/_static/img/icons/icon-exclamation.svg b/stable/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/stable/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-expand.svg b/stable/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/stable/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/stable/_static/img/icons/icon-forum.svg b/stable/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/stable/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-getting-started.svg b/stable/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/stable/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-glossary.svg b/stable/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/stable/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-home.svg b/stable/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/stable/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-infoworld.svg b/stable/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/stable/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/stable/_static/img/icons/icon-integrations.svg b/stable/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/stable/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-knowledge-base.svg b/stable/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/stable/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-less.svg b/stable/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/stable/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/stable/_static/img/icons/icon-live-test.svg b/stable/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/stable/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/stable/_static/img/icons/icon-mail-list.svg b/stable/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/stable/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-manager.svg b/stable/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/stable/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/stable/_static/img/icons/icon-memory-management.svg b/stable/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/stable/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/stable/_static/img/icons/icon-modeling.svg b/stable/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/stable/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-monitoring.svg b/stable/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/stable/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/stable/_static/img/icons/icon-networking.svg b/stable/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/stable/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/stable/_static/img/icons/icon-news.svg b/stable/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/stable/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/stable/_static/img/icons/icon-newsletter.svg b/stable/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/stable/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/stable/_static/img/icons/icon-nsql-guides.svg b/stable/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/stable/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/stable/_static/img/icons/icon-open-source.svg b/stable/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/stable/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/stable/_static/img/icons/icon-operator.svg b/stable/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/stable/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-overview.svg b/stable/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/stable/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/stable/_static/img/icons/icon-partners.svg b/stable/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/stable/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/stable/_static/img/icons/icon-plus.svg b/stable/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/stable/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/stable/_static/img/icons/icon-pricing.svg b/stable/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/stable/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/stable/_static/img/icons/icon-release-notes.svg b/stable/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/stable/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/stable/_static/img/icons/icon-resource-center.svg b/stable/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/stable/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/stable/_static/img/icons/icon-roadmap.svg b/stable/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/stable/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/stable/_static/img/icons/icon-search.svg b/stable/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/stable/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/stable/_static/img/icons/icon-slack.svg b/stable/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/stable/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-stack-overflow.svg b/stable/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/stable/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/stable/_static/img/icons/icon-summit.svg b/stable/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/stable/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-support.svg b/stable/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/stable/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/stable/_static/img/icons/icon-tech-talks.svg b/stable/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/stable/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/stable/_static/img/icons/icon-testing.svg b/stable/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/stable/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/stable/_static/img/icons/icon-thumbs-down.svg b/stable/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/stable/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-thumbs-up.svg b/stable/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/stable/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-tip.svg b/stable/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/stable/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/stable/_static/img/icons/icon-training.svg b/stable/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/stable/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/stable/_static/img/icons/icon-triangle-down.svg b/stable/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/stable/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/icons/icon-university.svg b/stable/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/stable/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/stable/_static/img/icons/icon-users-blog.svg b/stable/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/stable/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/stable/_static/img/icons/icon-warning.svg b/stable/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/stable/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-webinars.svg b/stable/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/stable/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/stable/_static/img/icons/icon-whitepapers.svg b/stable/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/stable/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/stable/_static/img/icons/icon-workshop.svg b/stable/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/stable/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/logo-docs.svg b/stable/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/stable/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stable/_static/img/logo-scylla-horizontal-RGB.svg b/stable/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/stable/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stable/_static/img/mascots/404.jpg b/stable/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/stable/_static/img/mascots/404.jpg differ diff --git a/stable/_static/img/mascots/scylla-3monsters.png b/stable/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/stable/_static/img/mascots/scylla-3monsters.png differ diff --git a/stable/_static/img/mascots/scylla-advisor-crystal.png b/stable/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/stable/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/stable/_static/img/mascots/scylla-alternator.svg b/stable/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/stable/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/stable/_static/img/mascots/scylla-cloud.svg b/stable/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/stable/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/stable/_static/img/mascots/scylla-computer-3-monsters.png b/stable/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/stable/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/stable/_static/img/mascots/scylla-computer-headset.png b/stable/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/stable/_static/img/mascots/scylla-computer-headset.png differ diff --git a/stable/_static/img/mascots/scylla-cup-number-one.png b/stable/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/stable/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/stable/_static/img/mascots/scylla-docs.svg b/stable/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/stable/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/stable/_static/img/mascots/scylla-drivers.svg b/stable/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/stable/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/stable/_static/img/mascots/scylla-enterprise.svg b/stable/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/stable/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/stable/_static/img/mascots/scylla-forklift-boxes.png b/stable/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/stable/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/stable/_static/img/mascots/scylla-forklift-migration.png b/stable/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/stable/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/stable/_static/img/mascots/scylla-gear.png b/stable/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/stable/_static/img/mascots/scylla-gear.png differ diff --git a/stable/_static/img/mascots/scylla-hardhat.png b/stable/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/stable/_static/img/mascots/scylla-hardhat.png differ diff --git a/stable/_static/img/mascots/scylla-headband.png b/stable/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/stable/_static/img/mascots/scylla-headband.png differ diff --git a/stable/_static/img/mascots/scylla-headset.png b/stable/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/stable/_static/img/mascots/scylla-headset.png differ diff --git a/stable/_static/img/mascots/scylla-hearts.png b/stable/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/stable/_static/img/mascots/scylla-hearts.png differ diff --git a/stable/_static/img/mascots/scylla-looking-down.png b/stable/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/stable/_static/img/mascots/scylla-looking-down.png differ diff --git a/stable/_static/img/mascots/scylla-looking-up.png b/stable/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/stable/_static/img/mascots/scylla-looking-up.png differ diff --git a/stable/_static/img/mascots/scylla-magnifying-glass-fronting.png b/stable/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/stable/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/stable/_static/img/mascots/scylla-magnifying-glass.png b/stable/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/stable/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/stable/_static/img/mascots/scylla-manager.svg b/stable/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/stable/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/stable/_static/img/mascots/scylla-monitor.svg b/stable/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/stable/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/stable/_static/img/mascots/scylla-movement-fast.png b/stable/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/stable/_static/img/mascots/scylla-movement-fast.png differ diff --git a/stable/_static/img/mascots/scylla-movement.png b/stable/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/stable/_static/img/mascots/scylla-movement.png differ diff --git a/stable/_static/img/mascots/scylla-onpremise.png b/stable/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/stable/_static/img/mascots/scylla-onpremise.png differ diff --git a/stable/_static/img/mascots/scylla-opensource.svg b/stable/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/stable/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/stable/_static/img/mascots/scylla-operator.svg b/stable/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/stable/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/stable/_static/img/mascots/scylla-plugin.png b/stable/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/stable/_static/img/mascots/scylla-plugin.png differ diff --git a/stable/_static/img/mascots/scylla-release-mascot.png b/stable/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/stable/_static/img/mascots/scylla-release-mascot.png differ diff --git a/stable/_static/img/mascots/scylla-repair.png b/stable/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/stable/_static/img/mascots/scylla-repair.png differ diff --git a/stable/_static/img/mascots/scylla-server.png b/stable/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/stable/_static/img/mascots/scylla-server.png differ diff --git a/stable/_static/img/mascots/scylla-sleeping.png b/stable/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/stable/_static/img/mascots/scylla-sleeping.png differ diff --git a/stable/_static/img/mascots/scylla-tall-measure.png b/stable/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/stable/_static/img/mascots/scylla-tall-measure.png differ diff --git a/stable/_static/img/mascots/scylla-university.png b/stable/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/stable/_static/img/mascots/scylla-university.png differ diff --git a/stable/_static/img/mascots/scylla-weights.png b/stable/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/stable/_static/img/mascots/scylla-weights.png differ diff --git a/stable/_static/img/mascots/scylla-window-cleaning.png b/stable/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/stable/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/stable/_static/img/mascots/scylla-with-computer-2.png b/stable/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/stable/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/stable/_static/img/mascots/scylla-with-computer.png b/stable/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/stable/_static/img/mascots/scylla-with-computer.png differ diff --git a/stable/_static/img/mascots/scylla-with-linux.png b/stable/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/stable/_static/img/mascots/scylla-with-linux.png differ diff --git a/stable/_static/img/mascots/scylla-writting.png b/stable/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/stable/_static/img/mascots/scylla-writting.png differ diff --git a/stable/_static/img/menu.svg b/stable/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/stable/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/scylla-monitor.png b/stable/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/stable/_static/img/scylla-monitor.png differ diff --git a/stable/_static/js/main.bundle.js b/stable/_static/js/main.bundle.js new file mode 100644 index 000000000..024014d2c --- /dev/null +++ b/stable/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;window,i=function(t){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}({"./js/entries/foundation.js":function(t,e,n){"use strict";n.r(e);var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.js");n.d(e,"Foundation",(function(){return r.Foundation}));var s=n("./js/foundation.core.utils.js");n.d(e,"CoreUtils",(function(){return s}));var a=n("./js/foundation.util.box.js");n.d(e,"Box",(function(){return a.Box}));var l=n("./js/foundation.util.imageLoader.js");n.d(e,"onImagesLoaded",(function(){return l.onImagesLoaded}));var u=n("./js/foundation.util.keyboard.js");n.d(e,"Keyboard",(function(){return u.Keyboard}));var c=n("./js/foundation.util.mediaQuery.js");n.d(e,"MediaQuery",(function(){return c.MediaQuery}));var f=n("./js/foundation.util.motion.js");n.d(e,"Motion",(function(){return f.Motion}));var d=n("./js/foundation.util.nest.js");n.d(e,"Nest",(function(){return d.Nest}));var h=n("./js/foundation.util.timer.js");n.d(e,"Timer",(function(){return h.Timer}));var p=n("./js/foundation.util.touch.js");n.d(e,"Touch",(function(){return p.Touch}));var v=n("./js/foundation.util.triggers.js");n.d(e,"Triggers",(function(){return v.Triggers}));var m=n("./js/foundation.abide.js");n.d(e,"Abide",(function(){return m.Abide}));var g=n("./js/foundation.accordion.js");n.d(e,"Accordion",(function(){return g.Accordion}));var y=n("./js/foundation.accordionMenu.js");n.d(e,"AccordionMenu",(function(){return y.AccordionMenu}));var b=n("./js/foundation.drilldown.js");n.d(e,"Drilldown",(function(){return b.Drilldown}));var w=n("./js/foundation.dropdown.js");n.d(e,"Dropdown",(function(){return w.Dropdown}));var k=n("./js/foundation.dropdownMenu.js");n.d(e,"DropdownMenu",(function(){return k.DropdownMenu}));var _=n("./js/foundation.equalizer.js");n.d(e,"Equalizer",(function(){return _.Equalizer}));var $=n("./js/foundation.interchange.js");n.d(e,"Interchange",(function(){return $.Interchange}));var j=n("./js/foundation.magellan.js");n.d(e,"Magellan",(function(){return j.Magellan}));var C=n("./js/foundation.offcanvas.js");n.d(e,"OffCanvas",(function(){return C.OffCanvas}));var x=n("./js/foundation.orbit.js");n.d(e,"Orbit",(function(){return x.Orbit}));var O=n("./js/foundation.responsiveMenu.js");n.d(e,"ResponsiveMenu",(function(){return O.ResponsiveMenu}));var T=n("./js/foundation.responsiveToggle.js");n.d(e,"ResponsiveToggle",(function(){return T.ResponsiveToggle}));var S=n("./js/foundation.reveal.js");n.d(e,"Reveal",(function(){return S.Reveal}));var z=n("./js/foundation.slider.js");n.d(e,"Slider",(function(){return z.Slider}));var E=n("./js/foundation.smoothScroll.js");n.d(e,"SmoothScroll",(function(){return E.SmoothScroll}));var A=n("./js/foundation.sticky.js");n.d(e,"Sticky",(function(){return A.Sticky}));var R=n("./js/foundation.tabs.js");n.d(e,"Tabs",(function(){return R.Tabs}));var P=n("./js/foundation.toggler.js");n.d(e,"Toggler",(function(){return P.Toggler}));var L=n("./js/foundation.tooltip.js");n.d(e,"Tooltip",(function(){return L.Tooltip}));var D=n("./js/foundation.responsiveAccordionTabs.js");n.d(e,"ResponsiveAccordionTabs",(function(){return D.ResponsiveAccordionTabs})),r.Foundation.addToJquery(o.a),r.Foundation.rtl=s.rtl,r.Foundation.GetYoDigits=s.GetYoDigits,r.Foundation.transitionend=s.transitionend,r.Foundation.RegExpEscape=s.RegExpEscape,r.Foundation.onLoad=s.onLoad,r.Foundation.Box=a.Box,r.Foundation.onImagesLoaded=l.onImagesLoaded,r.Foundation.Keyboard=u.Keyboard,r.Foundation.MediaQuery=c.MediaQuery,r.Foundation.Motion=f.Motion,r.Foundation.Move=f.Move,r.Foundation.Nest=d.Nest,r.Foundation.Timer=h.Timer,p.Touch.init(o.a),v.Triggers.init(o.a,r.Foundation),c.MediaQuery._init(),r.Foundation.plugin(m.Abide,"Abide"),r.Foundation.plugin(g.Accordion,"Accordion"),r.Foundation.plugin(y.AccordionMenu,"AccordionMenu"),r.Foundation.plugin(b.Drilldown,"Drilldown"),r.Foundation.plugin(w.Dropdown,"Dropdown"),r.Foundation.plugin(k.DropdownMenu,"DropdownMenu"),r.Foundation.plugin(_.Equalizer,"Equalizer"),r.Foundation.plugin($.Interchange,"Interchange"),r.Foundation.plugin(j.Magellan,"Magellan"),r.Foundation.plugin(C.OffCanvas,"OffCanvas"),r.Foundation.plugin(x.Orbit,"Orbit"),r.Foundation.plugin(O.ResponsiveMenu,"ResponsiveMenu"),r.Foundation.plugin(T.ResponsiveToggle,"ResponsiveToggle"),r.Foundation.plugin(S.Reveal,"Reveal"),r.Foundation.plugin(z.Slider,"Slider"),r.Foundation.plugin(E.SmoothScroll,"SmoothScroll"),r.Foundation.plugin(A.Sticky,"Sticky"),r.Foundation.plugin(R.Tabs,"Tabs"),r.Foundation.plugin(P.Toggler,"Toggler"),r.Foundation.plugin(L.Tooltip,"Tooltip"),r.Foundation.plugin(D.ResponsiveAccordionTabs,"ResponsiveAccordionTabs"),e.default=r.Foundation},"./js/foundation.abide.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Abide",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o.a.extend(!0,{},h.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o.a.merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0})}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label"),i=e.first();if(e.length){if(void 0===t.attr("aria-describedby")){var r=i.attr("id");void 0===r&&(r=Object(s.GetYoDigits)(6,"abide-error"),i.attr("id",r)),t.attr("aria-describedby",r)}if(n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&u(e.prototype,n),h}(r.Plugin);h.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return h.defaults.patterns.domain.test(t)||h.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Accordion",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&c(e.prototype,n),v}(n("./js/foundation.core.plugin.js").Plugin);p.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Foundation",(function(){return l}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.7.4",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=Object(r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o.a;try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o.a.each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o.a.fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o.a}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o.a.contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one(Object(a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one(Object(a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one(Object(a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one(Object(a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one(Object(a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&f(e.prototype,n),m}(n("./js/foundation.core.plugin.js").Plugin);v.defaults={autoApplyClass:!0,backButton:'
                                  • Back
                                  • ',backButtonPosition:"top",wrapper:"
                                    ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Dropdown",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o.a.extend(h,{down:u,up:c,next:d,previous:f}):o.a.extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o.a.extend(h,{next:c,previous:u,down:f,up:d}):o.a.extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o.a.extend(h,{next:d,previous:f,down:u,up:c}):o.a.extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&h(e.prototype,n),g}(r.Plugin);g.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Equalizer",(function(){return p}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?Object(s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=Object(s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o.a.isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                                      "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                                      ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                                      ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                                      ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||Object(s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveMenu",(function(){return y}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==g[l]&&(t[a]=g[l])}this.rules=t}o.a.isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||Object(s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o.a.each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o.a.each(g,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&h(e.prototype,n),u}(a.Plugin);y.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){"use strict";n.r(e),n.d(e,"ResponsiveToggle",(function(){return h}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o.a.contains(e.$element[0],t.target)&&o.a.contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o.a.contains(t.$element[0],e.target)&&o.a.contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&p(e.prototype,n),y}(r.Plugin);y.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Slider",(function(){return g}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=y(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*y((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var m,g=0===this.handles.index(t),b=Math.floor(100*y(f,d));if(g)v[c]="".concat(p,"%"),m=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);m=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(m,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;Object(s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||Object(a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=y(h=p<0?0:p>c?c:p,c);i=this._value(v),Object(a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=b(this.$handle,l,h,s)<=b(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(t){var e,i=o()(this),s=n.options.doubleSided?n.handles.index(i):0,a=parseFloat(n.inputs.eq(s).val());r.Keyboard.handleKey(t,"Slider",{decrease:function(){e=a-n.options.step},increase:function(){e=a+n.options.step},decreaseFast:function(){e=a-10*n.options.step},increaseFast:function(){e=a+10*n.options.step},min:function(){e=n.options.start},max:function(){e=n.options.end},handled:function(){t.preventDefault(),n._setHandlePos(i,e)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&h(e.prototype,n),g}(l.Plugin);function y(t,e){return t/e}function b(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}g.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){"use strict";n.r(e),n.d(e,"SmoothScroll",(function(){return d}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:p.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o.a.extend({},p.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||Object(r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,p.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&l(e.prototype,n),i&&l(e,i),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Sticky",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=m(this.options.marginTop),i=m(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&f(e.prototype,n),v}(r.Plugin);function m(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}v.defaults={container:"
                                      ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Tabs",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&f(e.prototype,n),m}(r.Plugin);v.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Toggler",(function(){return v}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function f(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){f(p(m.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",Object(r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&c(e.prototype,n),m}(n("./js/foundation.positionable.js").Positionable);v.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Box",(function(){return i}));var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){"use strict";n.r(e),n.d(e,"onImagesLoaded",(function(){return r}));var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Keyboard",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:Object(r.rtl)()?o.a.extend({},s.ltr,s.rtl):o.a.extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){"use strict";n.r(e),n.d(e,"MediaQuery",(function(){return a}));var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(i=n.next()).done)&&(r.push(i.value),!e||r.length!==e);s=!0);}catch(t){a=!0,o=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw o}}return r}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");n.length&&(t.addClass(s),a&&(t.children("a:first").attr({"aria-haspopup":!0,"aria-label":t.children("a:first").text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})),n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})),t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){"use strict";function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,"Timer",(function(){return i}))},"./js/foundation.util.touch.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Touch",(function(){return c}));var i=n("jquery"),o=n.n(i);function r(t,e){for(var n=0;n=o.a.spotSwipe.moveThreshold&&l<=o.a.spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),h.apply(this,arguments),o()(this).trigger(o.a.Event("swipe",Object.assign({},t)),e).trigger(o.a.Event("swipe".concat(e),Object.assign({},t))))}}function v(t){1===t.touches.length&&(s=t.touches[0].pageX,u=t,f=!0,d=!1,a=(new Date).getTime(),this.addEventListener("touchmove",p,{passive:!0===o.a.spotSwipe.preventDefault}),this.addEventListener("touchend",h,!1))}function m(){this.addEventListener&&this.addEventListener("touchstart",v,{passive:!0})}var g=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o.a.event.special.swipe={setup:m},o.a.event.special.tap={setup:m},o.a.each(["left","up","down","right"],(function(){o.a.event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o.a.noop)}}}))}}])&&r(e.prototype,n),t}();c.setupSpotSwipe=function(){o.a.spotSwipe=new g(o.a)},c.setupTouchHandler=function(){o.a.fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},c.init=function(){void 0===o.a.spotSwipe&&(c.setupSpotSwipe(o.a),c.setupTouchHandler(o.a))}},"./js/foundation.util.triggers.js":function(t,e,n){"use strict";n.r(e),n.d(e,"Triggers",(function(){return c}));var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}j.fn=j.prototype={jquery:$,constructor:j,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=j.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return j.each(this,t)},map:function(t){return this.pushStack(j.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(j.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(j.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),Q=new RegExp(M+"|>"),K=new RegExp(I),G=new RegExp("^"+H+"$"),Y={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},U=/HTML$/i,V=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},it=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ot=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){d()},st=wt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{R.apply(z=P.call(k.childNodes),k.childNodes),z[k.childNodes.length].nodeType}catch(t){R={apply:z.length?function(t,e){A.apply(t,P.call(e))}:function(t,e){for(var n=t.length,i=0;t[n++]=e[i++];);t.length=n-1}}}function at(t,e,i,o){var r,a,u,c,f,p,g,y=e&&e.ownerDocument,k=e?e.nodeType:9;if(i=i||[],"string"!=typeof t||!t||1!==k&&9!==k&&11!==k)return i;if(!o&&(d(e),e=e||h,v)){if(11!==k&&(f=J.exec(t)))if(r=f[1]){if(9===k){if(!(u=e.getElementById(r)))return i;if(u.id===r)return i.push(u),i}else if(y&&(u=y.getElementById(r))&&b(e,u)&&u.id===r)return i.push(u),i}else{if(f[2])return R.apply(i,e.getElementsByTagName(t)),i;if((r=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return R.apply(i,e.getElementsByClassName(r)),i}if(n.qsa&&!O[t+" "]&&(!m||!m.test(t))&&(1!==k||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===k&&(Q.test(t)||W.test(t))){for((y=tt.test(t)&>(e.parentNode)||e)===e&&n.scope||((c=e.getAttribute("id"))?c=c.replace(it,ot):e.setAttribute("id",c=w)),a=(p=s(t)).length;a--;)p[a]=(c?"#"+c:":scope")+" "+bt(p[a]);g=p.join(",")}try{return R.apply(i,y.querySelectorAll(g)),i}catch(e){O(t,!0)}finally{c===w&&e.removeAttribute("id")}}}return l(t.replace(F,"$1"),e,i,o)}function lt(){var t=[];return function e(n,o){return t.push(n+" ")>i.cacheLength&&delete e[t.shift()],e[n+" "]=o}}function ut(t){return t[w]=!0,t}function ct(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ft(t,e){for(var n=t.split("|"),o=n.length;o--;)i.attrHandle[n[o]]=e}function dt(t,e){var n=e&&t,i=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function pt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&st(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function mt(t){return ut((function(e){return e=+e,ut((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},r=at.isXML=function(t){var e=t&&t.namespaceURI,n=t&&(t.ownerDocument||t).documentElement;return!U.test(e||n&&n.nodeName||"HTML")},d=at.setDocument=function(t){var e,o,s=t?t.ownerDocument||t:k;return s!=h&&9===s.nodeType&&s.documentElement?(p=(h=s).documentElement,v=!r(h),k!=h&&(o=h.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",rt,!1):o.attachEvent&&o.attachEvent("onunload",rt)),n.scope=ct((function(t){return p.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ct((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ct((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ct((function(t){return p.appendChild(t).id=w,!h.getElementsByName||!h.getElementsByName(w).length})),n.getById?(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(i.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},i.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),i.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,i=[],o=0,r=e.getElementsByTagName(t);if("*"===t){for(;n=r[o++];)1===n.nodeType&&i.push(n);return i}return r},i.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},g=[],m=[],(n.qsa=Z.test(h.querySelectorAll))&&(ct((function(t){var e;p.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||m.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+D+")"),t.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||m.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||m.push(":checked"),t.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),t.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ct((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&m.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ct((function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",I)})),m=m.length&&new RegExp(m.join("|")),g=g.length&&new RegExp(g.join("|")),e=Z.test(p.compareDocumentPosition),b=e||Z.test(p.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,i=e&&e.parentNode;return t===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):t.compareDocumentPosition&&16&t.compareDocumentPosition(i)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},T=e?function(t,e){if(t===e)return f=!0,0;var i=!t.compareDocumentPosition-!e.compareDocumentPosition;return i||(1&(i=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===i?t==h||t.ownerDocument==k&&b(k,t)?-1:e==h||e.ownerDocument==k&&b(k,e)?1:c?L(c,t)-L(c,e):0:4&i?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,i=0,o=t.parentNode,r=e.parentNode,s=[t],a=[e];if(!o||!r)return t==h?-1:e==h?1:o?-1:r?1:c?L(c,t)-L(c,e):0;if(o===r)return dt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?dt(s[i],a[i]):s[i]==k?-1:a[i]==k?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),n.matchesSelector&&v&&!O[e+" "]&&(!g||!g.test(e))&&(!m||!m.test(e)))try{var i=y.call(t,e);if(i||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return i}catch(t){O(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&d(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&d(t);var o=i.attrHandle[e.toLowerCase()],r=o&&S.call(i.attrHandle,e.toLowerCase())?o(t,e,!v):void 0;return void 0!==r?r:n.attributes||!v?t.getAttribute(e):(r=t.getAttributeNode(e))&&r.specified?r.value:null},at.escape=function(t){return(t+"").replace(it,ot)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,i=[],o=0,r=0;if(f=!n.detectDuplicates,c=!n.sortStable&&t.slice(0),t.sort(T),f){for(;e=t[r++];)e===t[r]&&(o=i.push(r));for(;o--;)t.splice(i[o],1)}return c=null,t},o=at.getText=function(t){var e,n="",i=0,r=t.nodeType;if(r){if(1===r||9===r||11===r){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=o(t)}else if(3===r||4===r)return t.nodeValue}else for(;e=t[i++];)n+=o(e);return n},i=at.selectors={cacheLength:50,createPseudo:ut,match:Y,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return Y.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&K.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=j[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+M+"|$)"))&&j(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=at.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(N," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p,v=r!==s?"nextSibling":"previousSibling",m=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!l&&!a,b=!1;if(m){if(r){for(;v;){for(d=e;d=d[v];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;p=v="only"===t&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&y){for(b=(h=(u=(c=(f=(d=m)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1])&&u[2],d=h&&m.childNodes[h];d=++h&&d&&d[v]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===e){c[t]=[_,h,b];break}}else if(y&&(b=h=(u=(c=(f=(d=e)[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]||[])[0]===_&&u[1]),!1===b)for(;(d=++h&&d&&d[v]||(b=h=0)||p.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++b||(y&&((c=(f=d[w]||(d[w]={}))[d.uniqueID]||(f[d.uniqueID]={}))[t]=[_,b]),d!==e)););return(b-=o)===i||b%i==0&&b/i>=0}}},PSEUDO:function(t,e){var n,o=i.pseudos[t]||i.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return o[w]?o(e):o.length>1?(n=[t,t,"",e],i.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,n){for(var i,r=o(t,e),s=r.length;s--;)t[i=L(t,r[s])]=!(n[i]=r[s])})):function(t){return o(t,0,n)}):o}},pseudos:{not:ut((function(t){var e=[],n=[],i=a(t.replace(F,"$1"));return i[w]?ut((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||o(e)).indexOf(t)>-1}})),lang:ut((function(t){return G.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===p},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!i.pseudos.empty(t)},header:function(t){return X.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:mt((function(){return[0]})),last:mt((function(t,e){return[e-1]})),eq:mt((function(t,e,n){return[n<0?n+e:n]})),even:mt((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:mt((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function _t(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=f))}}else g=_t(g===s?g.splice(p,g.length):g),o?o(null,s,g,l):R.apply(s,g)}))}function jt(t){for(var e,n,o,r=t.length,s=i.relative[t[0].type],a=s||i.relative[" "],l=s?1:0,c=wt((function(t){return t===e}),a,!0),f=wt((function(t){return L(e,t)>-1}),a,!0),d=[function(t,n,i){var o=!s&&(i||n!==u)||((e=n).nodeType?c(t,n,i):f(t,n,i));return e=null,o}];l1&&kt(d),l>1&&bt(t.slice(0,l-1).concat({value:" "===t[l-2].type?"*":""})).replace(F,"$1"),n,l0,o=t.length>0,r=function(r,s,a,l,c){var f,p,m,g=0,y="0",b=r&&[],w=[],k=u,$=r||o&&i.find.TAG("*",c),j=_+=null==k?1:Math.random()||.1,C=$.length;for(c&&(u=s==h||s||c);y!==C&&null!=(f=$[y]);y++){if(o&&f){for(p=0,s||f.ownerDocument==h||(d(f),a=!v);m=t[p++];)if(m(f,s||h,a)){l.push(f);break}c&&(_=j)}n&&((f=!m&&f)&&g--,r&&b.push(f))}if(g+=y,n&&y!==g){for(p=0;m=e[p++];)m(b,w,s,a);if(r){if(g>0)for(;y--;)b[y]||w[y]||(w[y]=E.call(l));w=_t(w)}R.apply(l,w),c&&!r&&w.length>0&&g+e.length>1&&at.uniqueSort(l)}return c&&(_=j,u=k),b};return n?ut(r):r}(r,o)),a.selector=t}return a},l=at.select=function(t,e,n,o){var r,l,u,c,f,d="function"==typeof t&&t,h=!o&&s(t=d.selector||t);if(n=n||[],1===h.length){if((l=h[0]=h[0].slice(0)).length>2&&"ID"===(u=l[0]).type&&9===e.nodeType&&v&&i.relative[l[1].type]){if(!(e=(i.find.ID(u.matches[0].replace(et,nt),e)||[])[0]))return n;d&&(e=e.parentNode),t=t.slice(l.shift().value.length)}for(r=Y.needsContext.test(t)?0:l.length;r--&&(u=l[r],!i.relative[c=u.type]);)if((f=i.find[c])&&(o=f(u.matches[0].replace(et,nt),tt.test(l[0].type)&>(e.parentNode)||e))){if(l.splice(r,1),!(t=o.length&&bt(l)))return R.apply(n,o),n;break}}return(d||a(t,h))(o,e,!v,n,!e||tt.test(t)&>(e.parentNode)||e),n},n.sortStable=w.split("").sort(T).join("")===w,n.detectDuplicates=!!f,d(),n.sortDetached=ct((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ct((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||ft("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ct((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ft("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ct((function(t){return null==t.getAttribute("disabled")}))||ft(D,(function(t,e,n){var i;if(!n)return!0===t[e]?e.toLowerCase():(i=t.getAttributeNode(e))&&i.specified?i.value:null})),at}(i);j.find=x,j.expr=x.selectors,j.expr[":"]=j.expr.pseudos,j.uniqueSort=j.unique=x.uniqueSort,j.text=x.getText,j.isXMLDoc=x.isXML,j.contains=x.contains,j.escapeSelector=x.escape;var O=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&j(t).is(n))break;i.push(t)}return i},T=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},S=j.expr.match.needsContext;function z(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var E=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function A(t,e,n){return g(e)?j.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?j.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?j.grep(t,(function(t){return c.call(e,t)>-1!==n})):j.filter(e,t,n)}j.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?j.find.matchesSelector(i,t)?[i]:[]:j.find.matches(t,j.grep(e,(function(t){return 1===t.nodeType})))},j.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(j(t).filter((function(){for(e=0;e1?j.uniqueSort(n):n},filter:function(t){return this.pushStack(A(this,t||[],!1))},not:function(t){return this.pushStack(A(this,t||[],!0))},is:function(t){return!!A(this,"string"==typeof t&&S.test(t)?j(t):t||[],!1).length}});var R,P=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(j.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||R,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:P.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof j?e[0]:e,j.merge(this,j.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),E.test(i[1])&&j.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(j):j.makeArray(t,this)}).prototype=j.fn,R=j(b);var L=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};function M(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}j.fn.extend({has:function(t){var e=j(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&j.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?j.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(j(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(j.uniqueSort(j.merge(this.get(),j(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),j.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return O(t,"parentNode")},parentsUntil:function(t,e,n){return O(t,"parentNode",n)},next:function(t){return M(t,"nextSibling")},prev:function(t){return M(t,"previousSibling")},nextAll:function(t){return O(t,"nextSibling")},prevAll:function(t){return O(t,"previousSibling")},nextUntil:function(t,e,n){return O(t,"nextSibling",n)},prevUntil:function(t,e,n){return O(t,"previousSibling",n)},siblings:function(t){return T((t.parentNode||{}).firstChild,t)},children:function(t){return T(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(z(t,"template")&&(t=t.content||t),j.merge([],t.childNodes))}},(function(t,e){j.fn[t]=function(n,i){var o=j.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=j.filter(i,o)),this.length>1&&(D[t]||j.uniqueSort(o),L.test(t)&&o.reverse()),this.pushStack(o)}}));var H=/[^\x20\t\r\n\f]+/g;function q(t){return t}function I(t){throw t}function N(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}j.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return j.each(t.match(H)||[],(function(t,n){e[n]=!0})),e}(t):j.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?j.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},j.extend({Deferred:function(t){var e=[["notify","progress",j.Callbacks("memory"),j.Callbacks("memory"),2],["resolve","done",j.Callbacks("once memory"),j.Callbacks("once memory"),0,"resolved"],["reject","fail",j.Callbacks("once memory"),j.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return j.Deferred((function(n){j.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==I&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(j.Deferred.getStackHook&&(c.stackTrace=j.Deferred.getStackHook()),i.setTimeout(c))}}return j.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:q,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:q)),e[2][3].add(s(0,i,g(n)?n:I))})).promise()},promise:function(t){return null!=t?j.extend(t,o):o}},r={};return j.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=j.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(N(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)N(o[n],s(n),r.reject);return r.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;j.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&F.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},j.readyException=function(t){i.setTimeout((function(){throw t}))};var B=j.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),i.removeEventListener("load",W),j.ready()}j.fn.ready=function(t){return B.then(t).catch((function(t){j.readyException(t)})),this},j.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--j.readyWait:j.isReady)||(j.isReady=!0,!0!==t&&--j.readyWait>0||B.resolveWith(b,[j]))}}),j.ready.then=B.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(j.ready):(b.addEventListener("DOMContentLoaded",W),i.addEventListener("load",W));var Q=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===_(n))for(a in o=!0,n)Q(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(j(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){J.remove(this,t)}))}}),j.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=Z.get(t,e),n&&(!i||Array.isArray(n)?i=Z.access(t,e,j.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=j.queue(t,e),i=n.length,o=n.shift(),r=j._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){j.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Z.get(t,n)||Z.access(t,n,{empty:j.Callbacks("once memory").add((function(){Z.remove(t,[e+"queue",n])}))})}}),j.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;pt=b.createDocumentFragment().appendChild(b.createElement("div")),(vt=b.createElement("input")).setAttribute("type","radio"),vt.setAttribute("checked","checked"),vt.setAttribute("name","t"),pt.appendChild(vt),m.checkClone=pt.cloneNode(!0).cloneNode(!0).lastChild.checked,pt.innerHTML="",m.noCloneChecked=!!pt.cloneNode(!0).lastChild.defaultValue,pt.innerHTML="",m.option=!!pt.lastChild;var bt={thead:[1,"","
                                      "],col:[2,"","
                                      "],tr:[2,"","
                                      "],td:[3,"","
                                      "],_default:[0,"",""]};function wt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&z(t,e)?j.merge([t],n):n}function kt(t,e){for(var n=0,i=t.length;n",""]);var _t=/<|&#?\w+;/;function $t(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=at(r),s=wt(f.appendChild(r),"script"),u&&kt(s),n)for(c=0;r=s[c++];)yt.test(r.type||"")&&n.push(r);return f}var jt=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function xt(){return!1}function Ot(t,e){return t===function(){try{return b.activeElement}catch(t){}}()==("focus"===e)}function Tt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Tt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=xt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return j().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=j.guid++)),t.each((function(){j.event.add(this,e,o,i,n)}))}function St(t,e,n){n?(Z.set(t,e,!1),j.event.add(t,e,{namespace:!1,handler:function(t){var i,o,r=Z.get(this,e);if(1&t.isTrigger&&this[e]){if(r.length)(j.event.special[e]||{}).delegateType&&t.stopPropagation();else if(r=a.call(arguments),Z.set(this,e,r),i=n(this,e),this[e](),r!==(o=Z.get(this,e))||i?Z.set(this,e,!1):o={},r!==o)return t.stopImmediatePropagation(),t.preventDefault(),o&&o.value}else r.length&&(Z.set(this,e,{value:j.event.trigger(j.extend(r[0],j.Event.prototype),r.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Z.get(t,e)&&j.event.add(t,e,Ct)}j.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.get(t);if(V(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&j.find.matchesSelector(st,o),n.guid||(n.guid=j.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==j&&j.event.triggered!==e.type?j.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=j.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=j.event.special[h]||{},c=j.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&j.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),j.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=Z.hasData(t)&&Z.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(H)||[""]).length;u--;)if(h=v=(a=jt.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=j.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||j.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)j.event.remove(t,h+e[u],n,i,!0);j.isEmptyObject(l)&&Z.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=j.event.fix(t),u=(Z.get(this,"events")||Object.create(null))[l.type]||[],c=j.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:j.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Rt(t,e){return z(t,"table")&&z(11!==e.nodeType?e:e.firstChild,"tr")&&j(t).children("tbody")[0]||t}function Pt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Lt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Dt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(Z.hasData(t)&&(a=Z.get(t).events))for(o in Z.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&Et.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Ht(r,e,n,i)}));if(d&&(r=(o=$t(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=j.map(wt(o,"script"),Pt)).length;f0&&kt(s,!l&&wt(t,"script")),a},cleanData:function(t){for(var e,n,i,o=j.event.special,r=0;void 0!==(n=t[r]);r++)if(V(n)){if(e=n[Z.expando]){if(e.events)for(i in e.events)o[i]?j.event.remove(n,i):j.removeEvent(n,i,e.handle);n[Z.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),j.fn.extend({detach:function(t){return qt(this,t,!0)},remove:function(t){return qt(this,t)},text:function(t){return Q(this,(function(t){return void 0===t?j.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ht(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Rt(this,t).appendChild(t)}))},prepend:function(){return Ht(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Rt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ht(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(j.cleanData(wt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return j.clone(this,t,e)}))},html:function(t){return Q(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!zt.test(t)&&!bt[(gt.exec(t)||["",""])[1].toLowerCase()]){t=j.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l}function ne(t,e,n){var i=Nt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===j.css(t,"boxSizing",!1,i),r=o,s=Wt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(It.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&z(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===j.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===j.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ee(t,e,n||(o?"border":"content"),r,i,s)+"px"}function ie(t,e,n,i,o){return new ie.prototype.init(t,e,n,i,o)}j.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Wt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=U(e),l=Xt.test(e),u=t.style;if(l||(e=Ut(a)),s=j.cssHooks[e]||j.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ot.exec(n))&&o[1]&&(n=ct(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(j.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=U(e);return Xt.test(e)||(e=Ut(a)),(s=j.cssHooks[e]||j.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Wt(t,e,i)),"normal"===o&&e in Jt&&(o=Jt[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),j.each(["height","width"],(function(t,e){j.cssHooks[e]={get:function(t,n,i){if(n)return!Vt.test(j.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ne(t,e,i):Ft(t,Zt,(function(){return ne(t,e,i)}))},set:function(t,n,i){var o,r=Nt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===j.css(t,"boxSizing",!1,r),l=i?ee(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ee(t,e,"border",!1,r)-.5)),l&&(o=ot.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=j.css(t,e)),te(0,n,l)}}})),j.cssHooks.marginLeft=Qt(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Wt(t,"marginLeft"))||t.getBoundingClientRect().left-Ft(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),j.each({margin:"",padding:"",border:"Width"},(function(t,e){j.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+rt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(j.cssHooks[t+e].set=te)})),j.fn.extend({css:function(t,e){return Q(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Nt(t),o=e.length;s1)}}),j.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||j.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(j.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=j.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=j.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){j.fx.step[t.prop]?j.fx.step[t.prop](t):1!==t.elem.nodeType||!j.cssHooks[t.prop]&&null==t.elem.style[Ut(t.prop)]?t.elem[t.prop]=t.now:j.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},j.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},j.fx=ie.prototype.init,j.fx.step={};var oe,re,se=/^(?:toggle|show|hide)$/,ae=/queueHooks$/;function le(){re&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(le):i.setTimeout(le,j.fx.interval),j.fx.tick())}function ue(){return i.setTimeout((function(){oe=void 0})),oe=Date.now()}function ce(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=rt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function fe(t,e,n){for(var i,o=(de.tweeners[e]||[]).concat(de.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){j.removeAttr(this,t)}))}}),j.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?j.prop(t,e,n):(1===r&&j.isXMLDoc(t)||(o=j.attrHooks[e.toLowerCase()]||(j.expr.match.bool.test(e)?he:void 0)),void 0!==n?null===n?void j.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=j.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&z(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(H);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),he={set:function(t,e,n){return!1===e?j.removeAttr(t,n):t.setAttribute(n,n),n}},j.each(j.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=pe[e]||j.find.attr;pe[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=pe[s],pe[s]=o,o=null!=n(t,e,i)?s:null,pe[s]=r),o}}));var ve=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(H)||[]).join(" ")}function ye(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(H)||[]}j.fn.extend({prop:function(t,e){return Q(this,j.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[j.propFix[t]||t]}))}}),j.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&j.isXMLDoc(t)||(e=j.propFix[e]||e,o=j.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=j.find.attr(t,"tabindex");return e?parseInt(e,10):ve.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(j.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),j.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){j.propFix[this.toLowerCase()]=this})),j.fn.extend({addClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).addClass(t.call(this,e,ye(this)))}));if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)i.indexOf(" "+r+" ")<0&&(i+=r+" ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},removeClass:function(t){var e,n,i,o,r,s,a,l=0;if(g(t))return this.each((function(e){j(this).removeClass(t.call(this,e,ye(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;n=this[l++];)if(o=ye(n),i=1===n.nodeType&&" "+ge(o)+" "){for(s=0;r=e[s++];)for(;i.indexOf(" "+r+" ")>-1;)i=i.replace(" "+r+" "," ");o!==(a=ge(i))&&n.setAttribute("class",a)}return this},toggleClass:function(t,e){var n=typeof t,i="string"===n||Array.isArray(t);return"boolean"==typeof e&&i?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(n){j(this).toggleClass(t.call(this,n,ye(this),e),e)})):this.each((function(){var e,o,r,s;if(i)for(o=0,r=j(this),s=be(t);e=s[o++];)r.hasClass(e)?r.removeClass(e):r.addClass(e);else void 0!==t&&"boolean"!==n||((e=ye(this))&&Z.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Z.get(this,"__className__")||""))}))},hasClass:function(t){var e,n,i=0;for(e=" "+t+" ";n=this[i++];)if(1===n.nodeType&&(" "+ge(ye(n))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;j.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,j(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=j.map(o,(function(t){return null==t?"":t+""}))),(e=j.valHooks[this.type]||j.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=j.valHooks[o.type]||j.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(we,""):null==n?"":n:void 0}}),j.extend({valHooks:{option:{get:function(t){var e=j.find.attr(t,"value");return null!=e?e:ge(j.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),j.each(["radio","checkbox"],(function(){j.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=j.inArray(j(t).val(),e)>-1}},m.checkOn||(j.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),m.focusin="onfocusin"in i;var ke=/^(?:focusinfocus|focusoutblur)$/,_e=function(t){t.stopPropagation()};j.extend(j.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!ke.test(v+j.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[j.expando]?t:new j.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:j.makeArray(e,[t]),f=j.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,ke.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(Z.get(s,"events")||Object.create(null))[t.type]&&Z.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&V(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!V(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),j.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,_e),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,_e),j.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=j.extend(new j.Event,n,{type:t,isSimulated:!0});j.event.trigger(i,null,e)}}),j.fn.extend({trigger:function(t,e){return this.each((function(){j.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return j.event.trigger(t,e,n,!0)}}),m.focusin||j.each({focus:"focusin",blur:"focusout"},(function(t,e){var n=function(t){j.event.simulate(e,t.target,j.event.fix(t))};j.event.special[e]={setup:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e);o||i.addEventListener(t,n,!0),Z.access(i,e,(o||0)+1)},teardown:function(){var i=this.ownerDocument||this.document||this,o=Z.access(i,e)-1;o?Z.access(i,e,o):(i.removeEventListener(t,n,!0),Z.remove(i,e))}}}));var $e=i.location,je={guid:Date.now()},Ce=/\?/;j.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||j.error("Invalid XML: "+(n?j.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var xe=/\[\]$/,Oe=/\r?\n/g,Te=/^(?:submit|button|image|reset|file)$/i,Se=/^(?:input|select|textarea|keygen)/i;function ze(t,e,n,i){var o;if(Array.isArray(e))j.each(e,(function(e,o){n||xe.test(t)?i(t,o):ze(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==_(e))i(t,e);else for(o in e)ze(t+"["+o+"]",e[o],n,i)}j.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!j.isPlainObject(t))j.each(t,(function(){o(this.name,this.value)}));else for(n in t)ze(n,t[n],e,o);return i.join("&")},j.fn.extend({serialize:function(){return j.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=j.prop(this,"elements");return t?j.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!j(this).is(":disabled")&&Se.test(this.nodeName)&&!Te.test(t)&&(this.checked||!mt.test(t))})).map((function(t,e){var n=j(this).val();return null==n?null:Array.isArray(n)?j.map(n,(function(t){return{name:e.name,value:t.replace(Oe,"\r\n")}})):{name:e.name,value:n.replace(Oe,"\r\n")}})).get()}});var Ee=/%20/g,Ae=/#.*$/,Re=/([?&])_=[^&]*/,Pe=/^(.*?):[ \t]*([^\r\n]*)$/gm,Le=/^(?:GET|HEAD)$/,De=/^\/\//,Me={},He={},qe="*/".concat("*"),Ie=b.createElement("a");function Ne(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(H)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Fe(t,e,n,i){var o={},r=t===He;function s(a){var l;return o[a]=!0,j.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Be(t,e){var n,i,o=j.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&j.extend(!0,t,i),t}Ie.href=$e.href,j.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:$e.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test($e.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":qe,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":j.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Be(Be(t,j.ajaxSettings),e):Be(j.ajaxSettings,t)},ajaxPrefilter:Ne(Me),ajaxTransport:Ne(He),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=j.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?j(p):j.event,m=j.Deferred(),g=j.Callbacks("once memory"),y=h.statusCode||{},w={},k={},_="canceled",$={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Pe.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)$.always(t[$.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||_;return n&&n.abort(e),C(0,e),this}};if(m.promise($),h.url=((t||h.url||$e.href)+"").replace(De,$e.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(H)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ie.protocol+"//"+Ie.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=j.param(h.data,h.traditional)),Fe(Me,h,e,$),u)return $;for(f in(c=j.event&&h.global)&&0==j.active++&&j.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Le.test(h.type),o=h.url.replace(Ae,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(Ee,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(Ce.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Re,"$1"),d=(Ce.test(o)?"&":"?")+"_="+je.guid+++d),h.url=o+d),h.ifModified&&(j.lastModified[o]&&$.setRequestHeader("If-Modified-Since",j.lastModified[o]),j.etag[o]&&$.setRequestHeader("If-None-Match",j.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&$.setRequestHeader("Content-Type",h.contentType),$.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+qe+"; q=0.01":""):h.accepts["*"]),h.headers)$.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,$,h)||u))return $.abort();if(_="abort",g.add(h.complete),$.done(h.success),$.fail(h.error),n=Fe(He,h,e,$)){if($.readyState=1,c&&v.trigger("ajaxSend",[$,h]),u)return $;h.async&&h.timeout>0&&(a=i.setTimeout((function(){$.abort("timeout")}),h.timeout));try{u=!1,n.send(w,C)}catch(t){if(u)throw t;C(-1,t)}}else C(-1,"No Transport");function C(t,e,s,l){var f,d,b,w,k,_=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",$.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,$,s)),!f&&j.inArray("script",h.dataTypes)>-1&&j.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,$,f),f?(h.ifModified&&((k=$.getResponseHeader("Last-Modified"))&&(j.lastModified[o]=k),(k=$.getResponseHeader("etag"))&&(j.etag[o]=k)),204===t||"HEAD"===h.type?_="nocontent":304===t?_="notmodified":(_=w.state,d=w.data,f=!(b=w.error))):(b=_,!t&&_||(_="error",t<0&&(t=0))),$.status=t,$.statusText=(e||_)+"",f?m.resolveWith(p,[d,_,$]):m.rejectWith(p,[$,_,b]),$.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[$,h,f?d:b]),g.fireWith(p,[$,_]),c&&(v.trigger("ajaxComplete",[$,h]),--j.active||j.event.trigger("ajaxStop")))}return $},getJSON:function(t,e,n){return j.get(t,e,n,"json")},getScript:function(t,e){return j.get(t,void 0,e,"script")}}),j.each(["get","post"],(function(t,e){j[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),j.ajax(j.extend({url:t,type:e,dataType:o,data:n,success:i},j.isPlainObject(t)&&t))}})),j.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),j._evalUrl=function(t,e,n){return j.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){j.globalEval(t,e,n)}})},j.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=j(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){j(this).wrapInner(t.call(this,e))})):this.each((function(){var e=j(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){j(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){j(this).replaceWith(this.childNodes)})),this}}),j.expr.pseudos.hidden=function(t){return!j.expr.pseudos.visible(t)},j.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},j.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var We={0:200,1223:204},Qe=j.ajaxSettings.xhr();m.cors=!!Qe&&"withCredentials"in Qe,m.ajax=Qe=!!Qe,j.ajaxTransport((function(t){var e,n;if(m.cors||Qe&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(We[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),j.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),j.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return j.globalEval(t),t}}}),j.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),j.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=j(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +

                                      ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                      + + +
                                      + + + + + +
                                      + + +
                                      + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/genindex.html b/stable/genindex.html new file mode 100644 index 000000000..88f66ce70 --- /dev/null +++ b/stable/genindex.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + + + +
                                      + + + + + +
                                      + + +
                                      + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/index.html b/stable/index.html new file mode 100644 index 000000000..be3f8d3fc --- /dev/null +++ b/stable/index.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      ScyllaDB Monitoring Stack

                                      +
                                      +
                                      +

                                      ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                      +_images/monitor.png +

                                      The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                                      +
                                        +
                                      • prometheus - collects and stores metrics

                                      • +
                                      • alertmanager - handles alerts

                                      • +
                                      • grafana - dashboard server

                                      • +
                                      +

                                      Choose a topic to get started:

                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/install/docker-compose.html b/stable/install/docker-compose.html new file mode 100644 index 000000000..313a289c4 --- /dev/null +++ b/stable/install/docker-compose.html @@ -0,0 +1,823 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Using Docker Compose

                                      +

                                      Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                                      +

                                      Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                                      +
                                      +

                                      Warning

                                      +

                                      docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                                      +
                                      +
                                      +

                                      Prerequisite

                                      +

                                      Make sure you have docker and docker-compose installed.

                                      +
                                      +
                                      +

                                      Setting Prometheus

                                      +

                                      The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                                      +

                                      You can use ./prometheus-config.sh to generate the file, for example:

                                      +
                                      ./prometheus-config.sh --compose
                                      +
                                      +
                                      +

                                      For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                                      +
                                      +
                                      +

                                      Setting Grafana Provisioning

                                      +

                                      Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                                      +
                                      +

                                      Grafana Data-Source file

                                      +

                                      Run the following command to update the datasource:

                                      +
                                      ./grafana-datasource.sh --compose
                                      +
                                      +
                                      +

                                      You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                                      +
                                      +
                                      +

                                      Grafana Dashboard Load file

                                      +

                                      To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                                      +
                                      ./generate-dashboards.sh -t -v 2020.1
                                      +
                                      +
                                      +

                                      This command generates the files under: grafana/provisioning/dashboards/

                                      +
                                      +
                                      +
                                      +

                                      Docker Compose file

                                      +

                                      You can use the following example as a base for your docker compose.

                                      +

                                      Pass the following to a file called docker-compose.yml

                                      +
                                      services:
                                      +  alertmanager:
                                      +    container_name: aalert
                                      +    image: prom/alertmanager:v0.26.0
                                      +    ports:
                                      +    - 9093:9093
                                      +    volumes:
                                      +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                                      +  grafana:
                                      +    container_name: agraf
                                      +    environment:
                                      +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                                      +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                                      +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                                      +    # This is where you set Grafana security
                                      +    - GF_AUTH_BASIC_ENABLED=false
                                      +    - GF_AUTH_ANONYMOUS_ENABLED=true
                                      +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                                      +    - GF_SECURITY_ADMIN_PASSWORD=admin
                                      +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                                      +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                                      +    image: grafana/grafana:10.4.1
                                      +    ports:
                                      +    - 3000:3000
                                      +    user: 1000:1000
                                      +    volumes:
                                      +    - ./grafana/build:/var/lib/grafana/dashboards
                                      +    - ./grafana/plugins:/var/lib/grafana/plugins
                                      +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                                      +    # Uncomment the following line for grafana persistency
                                      +    # - path/to/grafana/dir:/var/lib/grafana
                                      +  loki:
                                      +    command:
                                      +    - --config.file=/mnt/config/loki-config.yaml
                                      +    container_name: loki
                                      +    image: grafana/loki:2.9.5
                                      +    ports:
                                      +    - 3100:3100
                                      +    volumes:
                                      +    - ./loki/rules:/etc/loki/rules
                                      +    - ./loki/conf:/mnt/config
                                      +  promotheus:
                                      +    command:
                                      +    - --config.file=/etc/prometheus/prometheus.yml
                                      +    container_name: aprom
                                      +    image: prom/prometheus:v2.51.1
                                      +    ports:
                                      +    - 9090:9090
                                      +    volumes:
                                      +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                                      +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                                      +    # instead of the following three targets, you can place three files under one directory and mount that directory
                                      +    # If you do, uncomment the following line and delete the three lines afterwards
                                      +    #- /path/to/targets:/etc/scylla.d/prometheus/targets/
                                      +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/targets/scylla_servers.yml
                                      +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/targets/scylla_manager_servers.yml
                                      +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/targets/node_exporter_servers.yml
                                      +    
                                      +    # Uncomment the following line for prometheus persistency 
                                      +    # - path/to/data/dir:/prometheus/data
                                      +  promtail:
                                      +    command:
                                      +    - --config.file=/etc/promtail/config.yml
                                      +    container_name: promtail
                                      +    image: grafana/promtail:2.7.3
                                      +    ports:
                                      +    - 1514:1514
                                      +    - 9080:9080
                                      +    volumes:
                                      +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                                      +version: '3'
                                      +
                                      +
                                      +
                                      +

                                      Start and Stop

                                      +

                                      To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                                      +
                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/install/docker_compose.html b/stable/install/docker_compose.html new file mode 100644 index 000000000..027ff2919 --- /dev/null +++ b/stable/install/docker_compose.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/install/index.html b/stable/install/index.html new file mode 100644 index 000000000..38e285656 --- /dev/null +++ b/stable/install/index.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Download and Install Scylla Monitoring Stack

                                      +
                                      +
                                      +

                                      Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                                      +

                                      Choose a topic to begin:

                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/install/min-prod-hw.html b/stable/install/min-prod-hw.html new file mode 100644 index 000000000..76c9770b5 --- /dev/null +++ b/stable/install/min-prod-hw.html @@ -0,0 +1,746 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Minimal Production System Recommendations

                                      +
                                        +
                                      • CPU - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs

                                      • +
                                      • Memory - 15GB+ DRAM and proportional to the number of cores.

                                      • +
                                      • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                      • +
                                      • Network - 1GbE/10GbE preferred

                                      • +
                                      +
                                      +

                                      Calculating Prometheus Minimal Disk Space requirement

                                      +

                                      Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                      +

                                      Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                      +

                                      For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                      +
                                      6 * 16 * 15 * 12MB ~ 16GB
                                      +
                                      +
                                      +

                                      To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                      +
                                      +
                                      +

                                      Calculating Prometheus Minimal Memory Space requirement

                                      +

                                      Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                      +

                                      For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                      + +
                                      + +++++++ + + + +
                                      # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                      00
                                      + +
                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/install/monitor-without-docker.html b/stable/install/monitor-without-docker.html new file mode 100644 index 000000000..25b115c44 --- /dev/null +++ b/stable/install/monitor-without-docker.html @@ -0,0 +1,1168 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Deploying Scylla Monitoring Stack Without Docker

                                      +
                                      +

                                      Introduction

                                      +

                                      The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                                      +

                                      Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                                      +

                                      Scylla Monitoring uses the following components:

                                      +
                                        +
                                      • Alertmanager

                                      • +
                                      • Grafana Loki

                                      • +
                                      • Prometheus

                                      • +
                                      • Grafana

                                      • +
                                      +

                                      The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components.

                                      +

                                      We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                                      +
                                      +
                                      +

                                      Minimal Production System Recommendations

                                      +
                                        +
                                      • CPU - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs

                                      • +
                                      • Memory - 15GB+ DRAM and proportional to the number of cores.

                                      • +
                                      • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                      • +
                                      • Network - 1GbE/10GbE preferred

                                      • +
                                      +
                                      +

                                      Calculating Prometheus Minimal Disk Space requirement

                                      +

                                      Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                      +

                                      Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                      +

                                      For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                      +
                                      6 * 16 * 15 * 12MB ~ 16GB
                                      +
                                      +
                                      +

                                      To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                      +
                                      +
                                      +

                                      Calculating Prometheus Minimal Memory Space requirement

                                      +

                                      Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                      +

                                      For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                      + +
                                      + +++++++ + + + +
                                      # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                      00
                                      + +
                                      +

                                      The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                                      +
                                      +

                                      Note

                                      +

                                      Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                                      +
                                      +
                                      +
                                      +
                                      +

                                      Install Scylla Monitoring Stack

                                      +

                                      The following procedure uses a CentOS 7 based instance

                                      +
                                        +
                                      1. Download the latest Scylla Monitoring Stack release.

                                      2. +
                                      +
                                      wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.7.2.tar.gz
                                      +
                                      +
                                      +
                                        +
                                      1. Open the tar

                                      2. +
                                      +

                                      tar -xvf scylla-monitoring-*.tar.gz

                                      +
                                      +
                                      +

                                      Install Alertmanager

                                      +

                                      Tested with alertmanager 0.26.0 version

                                      +
                                        +
                                      1. Install alertmanager

                                      2. +
                                      +
                                      wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
                                      +tar -xvf alertmanager-*.linux-amd64.tar.gz
                                      +
                                      +
                                      +
                                        +
                                      1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                                      2. +
                                      +

                                      For example:

                                      +
                                      cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.7.2/prometheus/rule_config.yml alertmanager-0.26.0.linux-amd64/alertmanager.yml
                                      +
                                      +
                                      +
                                        +
                                      1. Start the Alertmanager

                                      2. +
                                      +

                                      For example:

                                      +
                                      cd alertmanager-0.26.0.linux-amd64/
                                      +./alertmanager
                                      +
                                      +
                                      +
                                        +
                                      1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                                      2. +
                                      +

                                      For example:

                                      +
                                      http://192.168.135.166:9093/
                                      +
                                      +
                                      +../_images/alertmanager.png +
                                      +
                                      +

                                      Install Grafana Loki

                                      +

                                      Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                                      +

                                      We recomand using Loki with containers, but you can install it locally as described in Loki installation

                                      +

                                      You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                                      +

                                      Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                                      +

                                      Loki Related files

                                      +

                                      Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                                      +
                                      mkdir -p /etc/loki/rules
                                      +mkdir -p /etc/loki/config
                                      +cp loki/rules/* /etc/loki/rules
                                      +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                                      +
                                      +
                                      +

                                      Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                                      +

                                      Promtail Related files

                                      +

                                      Promtail has a configuration file. You need to copy and modify the configuration.

                                      +
                                      mkdir -p /etc/promtail/
                                      +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                                      +
                                      +
                                      +

                                      Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                                      +
                                      +
                                      +

                                      Install Prometheus

                                      +

                                      Tested with Prometheus version 2.49.1

                                      +
                                      +

                                      Note

                                      +

                                      If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                                      +
                                      +
                                        +
                                      1. Install Prometheus

                                      2. +
                                      +
                                      wget https://github.com/prometheus/prometheus/releases/download/v2.49.1/prometheus-2.49.1.linux-amd64.tar.gz
                                      +tar -xvf prometheus-*.linux-amd64.tar.gz
                                      +
                                      +
                                      +
                                        +
                                      1. Create Data and Config directories

                                      2. +
                                      +
                                      sudo mkdir -p /prometheus/data
                                      +sudo mkdir -p /etc/prometheus/prom_rules/
                                      +sudo mkdir -p /etc/scylla.d/prometheus/
                                      +
                                      +
                                      +
                                      +

                                      Note

                                      +

                                      To run Promethues as non-root user, you would need to give read write and execute permissions to those directories.

                                      +
                                      +
                                        +
                                      1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                                      2. +
                                      +

                                      Copy prometheus/prometheus.yml.template to prometheus.yml

                                      +

                                      For example:

                                      +
                                      cp scylla-monitoring-scylla-monitoring-4.7.2/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                                      +cp scylla-monitoring-scylla-monitoring-4.7.2/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                                      +
                                      +
                                      +
                                        +
                                      1. Edit the prometheus.yml file to point to the correct static data sources.

                                      2. +
                                      +
                                      +

                                      Note

                                      +

                                      Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                                      +
                                      +
                                      vi /etc/prometheus/prometheus.yml
                                      +
                                      +
                                      +

                                      Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                                      +

                                      For example if the alertmanager will run on the same host:

                                      +
                                      alerting:
                                      +   alertmanagers:
                                      +   - static_configs:
                                      +       - targets:
                                      +           - 127.0.0.1:9093
                                      +
                                      +
                                      +

                                      Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                                      +

                                      For example the scrape config for Scylla:

                                      +
                                      global:
                                      +  scrape_interval: 5s # By default, scrape targets every 5 second.
                                      +  scrape_timeout: 4s # Timeout before trying to scape a target again
                                      +
                                      +  # Attach these labels to any time series or alerts when communicating with
                                      +  # external systems (federation, remote storage, Alertmanager).
                                      +  external_labels:
                                      +    monitor: 'scylla-monitor'
                                      +
                                      +scrape_configs:
                                      +- job_name: scylla
                                      +  honor_labels: false
                                      +  file_sd_configs:
                                      +    - files:
                                      +      - /etc/scylla.d/prometheus/scylla_servers.yml
                                      +  relabel_configs:
                                      +    - source_labels: [__address__]
                                      +      regex:  '([^:]+)'
                                      +      target_label: __address__
                                      +      replacement: '${1}:9180'
                                      +
                                      +    - source_labels: [__address__]
                                      +      regex:  '(.*):.+'
                                      +      target_label: instance
                                      +      replacement: '${1}'
                                      +
                                      +
                                      +
                                        +
                                      1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                                      2. +
                                      +
                                      +

                                      Note

                                      +

                                      There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                                      +
                                      +

                                      An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                                      +
                                      +

                                      Note

                                      +

                                      You must have both files even if you are not using Scylla Manager

                                      +
                                      +

                                      Add the labels for the cluster and data-center

                                      +

                                      scylla_servers.yml:

                                      +

                                      For example:

                                      +
                                      cat /etc/scylla.d/prometheus/scylla_servers.yml
                                      +# List Scylla end points
                                      +
                                      +- targets:
                                      +  - 192.168.66.6
                                      +  - 192.168.66.244
                                      +  labels:
                                      +    cluster: cluster1
                                      +    dc: dc1
                                      +- targets:
                                      +    - 172.17.0.3
                                      +  labels:
                                      +    cluster: cluster1
                                      +    dc: dc2
                                      +
                                      +
                                      +
                                      +

                                      Note

                                      +

                                      See the previous note about deprecating the node_exporter_servers.yml file.

                                      +
                                      +

                                      scylla_manager_server.yml

                                      +

                                      For example:

                                      +
                                      cat /etc/scylla.d/prometheus/scylla_manager_server.yml
                                      +- targets:
                                      +  - 127.0.0.1:5090
                                      +
                                      +
                                      +
                                        +
                                      1. Start Prometheus server:

                                      2. +
                                      +

                                      For example:

                                      +
                                      cd cd prometheus-2.49.1.linux-amd64/
                                      +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                                      +
                                      +
                                      +

                                      Data should start accumulate on: /prometheus/data

                                      +
                                        +
                                      1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                                      2. +
                                      +

                                      For example:

                                      +
                                      http://192.168.135.166:9090/
                                      +
                                      +
                                      +../_images/1.png +

                                      Prometheus console should be visible

                                      +
                                        +
                                      1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                                      2. +
                                      +

                                      For example:

                                      +

                                      node_memory_MemFree

                                      +../_images/2.png +

                                      And

                                      +

                                      scylla_reactor_utilization

                                      +../_images/3.png +

                                      At this point Scylla is emitting the metrics and Prometheus is able to store them.

                                      +
                                      +
                                      +

                                      Install Grafana

                                      +

                                      Tested with Grafna 10.3.3

                                      +
                                        +
                                      1. Install Grafana based on the instructions here

                                      2. +
                                      +

                                      Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different, we will assume that you used yum/dnf install.

                                      +
                                        +
                                      1. Access Scylla-Grafana-monitoring directory

                                      2. +
                                      +
                                      cd scylla-monitoring-scylla-monitoring-4.7.2/
                                      +
                                      +
                                      +
                                        +
                                      1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                                      2. +
                                      +
                                      sudo cp -r grafana/plugins /var/lib/grafana/
                                      +
                                      +
                                      +
                                        +
                                      1. Provision the Dashboards

                                      2. +
                                      +

                                      For example Scylla Open-source version 5.4 and Scylla manager version 2.4

                                      +
                                      sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.5.4.yaml
                                      +sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml
                                      +sudo mkdir -p /var/lib/grafana/dashboards
                                      +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                                      +
                                      +
                                      +

                                      Edit the load.* you just copied. For example

                                      +
                                      $ cat /etc/grafana/provisioning/dashboards/load.manager_3.3.yaml
                                      +apiVersion: 1
                                      +
                                      +providers:
                                      +- name: 'manager_3.3'
                                      +  orgId: 1
                                      +  folder: ''
                                      +  type: file
                                      +  disableDeletion: false
                                      +  allowUiUpdates: true
                                      +  updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards
                                      +  options:
                                      +    path: /var/lib/grafana/dashboards/manager_3.3
                                      +
                                      +$ cat /etc/grafana/provisioning/dashboards/load.5.4.yaml
                                      +apiVersion: 1
                                      +
                                      +providers:
                                      +- name: '5.4'
                                      +  orgId: 1
                                      +  folder: ''
                                      +  type: file
                                      +  disableDeletion: false
                                      +  allowUiUpdates: true
                                      +  updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards
                                      +  options:
                                      +    path: /var/lib/grafana/dashboards/ver_5.4
                                      +
                                      +
                                      +
                                      +

                                      Note

                                      +

                                      A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                                      +
                                      +
                                        +
                                      1. Set the data source by copy datasource.yml and edit it

                                      2. +
                                      +
                                      sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                                      +
                                      +
                                      +
                                      +

                                      Note

                                      +

                                      Scylla uses a plugin to read from some system tables see the section below about using it.

                                      +
                                      +

                                      You should set the Prometheus and the alertmanager IP and port.

                                      +

                                      For example

                                      +
                                      sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                                      +apiVersion: 1
                                      +datasources:
                                      + - name: prometheus
                                      +   type: prometheus
                                      +   url: http://192.168.135.167:9090
                                      +   access: proxy
                                      +   basicAuth: false
                                      +
                                      + - name: alertmanager
                                      +   type: camptocamp-prometheus-alertmanager-datasource
                                      +   orgId: 1
                                      +   typeLogoUrl: public/img/icn-datasource.svg
                                      +   access: proxy
                                      +   url: http://192.168.135.166:9093
                                      +   password:
                                      +   user:
                                      +   database:
                                      +   basicAuth:
                                      +   isDefault:
                                      +   jsonData:
                                      +     severity_critical: '4'
                                      +     severity_high: '3'
                                      +     severity_warning: '2'
                                      +     severity_info: '1'
                                      +
                                      +
                                      +
                                        +
                                      1. Start the Grafana service

                                      2. +
                                      +

                                      For Grafana installed with yum install

                                      +

                                      sudo service grafana-server start

                                      +
                                        +
                                      1. Make sure Grafana is running

                                      2. +
                                      +

                                      Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                                      +../_images/grafana.png +
                                      +
                                      +

                                      Using Scylla Plugin with Grafana

                                      +

                                      Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                                      +

                                      Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                                      +
                                      +

                                      Setting a monitoring user

                                      +

                                      This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                                      +
                                        +
                                      • If you have not done so, enable authorization first.

                                      • +
                                      • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                                      • +
                                      • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                                      • +
                                      +
                                      +
                                      +

                                      Installing the Plugin

                                      +

                                      Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                                      +
                                      +
                                      +

                                      Configure the Plugin

                                      +

                                      Add an entry to the datasource.yml file

                                      +
                                      - name: scylla-datasource
                                      +  type: scylladb-scylla-datasource
                                      +  orgId: 1
                                      +  isDefault:
                                      +  jsonData:
                                      +  host: ''
                                      +#  secureJsonData:
                                      +#    user: 'scylla_monitoring'
                                      +#    password: 'scylla_monitoring'
                                      +
                                      +
                                      +

                                      As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                                      +
                                      +
                                      +

                                      Enable the Plugin

                                      +

                                      Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                                      +

                                      See more about it the Grafana configuration.

                                      +
                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/install/monitor_without_docker.html b/stable/install/monitor_without_docker.html new file mode 100644 index 000000000..c668ac5a7 --- /dev/null +++ b/stable/install/monitor_without_docker.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/install/monitoring-stack.html b/stable/install/monitoring-stack.html new file mode 100644 index 000000000..872eac51b --- /dev/null +++ b/stable/install/monitoring-stack.html @@ -0,0 +1,1109 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Install Scylla Monitoring Stack

                                      +

                                      This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                                      +

                                      The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                                      +

                                      For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                                      +
                                      +

                                      Minimal Production System Recommendations

                                      +
                                        +
                                      • CPU - For clusters with up to 100 cores use 2vCPUS, for larger clusters 4vCPUs

                                      • +
                                      • Memory - 15GB+ DRAM and proportional to the number of cores.

                                      • +
                                      • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                      • +
                                      • Network - 1GbE/10GbE preferred

                                      • +
                                      +
                                      +

                                      Calculating Prometheus Minimal Disk Space requirement

                                      +

                                      Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                      +

                                      Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                      +

                                      For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                      +
                                      6 * 16 * 15 * 12MB ~ 16GB
                                      +
                                      +
                                      +

                                      To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                      +
                                      +
                                      +

                                      Calculating Prometheus Minimal Memory Space requirement

                                      +

                                      Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                      +

                                      For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                      + +
                                      + +++++++ + + + +
                                      # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                      00
                                      + +
                                      +
                                      +
                                      +
                                      +

                                      Prerequisites

                                      +
                                        +
                                      • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                                      • +
                                      • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                                      • +
                                      + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      Scylla Monitoring Stack Compatibility Matrix

                                      Scylla Monitoring Stack Version

                                      Prometheus Version

                                      Grafana Version

                                      4.6

                                      2.48.1

                                      10.2.2

                                      4.5

                                      2.47.1

                                      10.1.5

                                      4.4

                                      2.44.0

                                      9.5.2

                                      4.3

                                      2.42.0

                                      9.3.8

                                      4.2

                                      2.41.0

                                      9.3.4

                                      4.1

                                      2.38.0

                                      9.1.0

                                      4.0

                                      2.34.0

                                      8.5.2

                                      3.11

                                      2.32.0

                                      8.3.4

                                      3.10

                                      2.32.0

                                      8.3.3

                                      3.9.2

                                      2.29.1

                                      8.2.7

                                      3.9

                                      2.29.1

                                      8.1.1

                                      3.8

                                      2.27.1

                                      7.5.7

                                      3.7

                                      2.25.2

                                      7.4.0

                                      3.6

                                      2.18.1

                                      7.3.5

                                      3.5

                                      2.18.1

                                      7.1.5

                                      3.4

                                      2.18.1

                                      6.7.3

                                      +
                                      +
                                      +

                                      Docker Post Installation

                                      +

                                      Docker post installation guide can be found here

                                      +
                                      +

                                      Note

                                      +

                                      Avoid running the container as root.

                                      +
                                      +

                                      To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                                      +
                                        +
                                      1. Create the Docker group.

                                      2. +
                                      +
                                      sudo groupadd docker
                                      +
                                      +
                                      +
                                        +
                                      1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                                      2. +
                                      +
                                      sudo usermod -aG docker $USER
                                      +
                                      +
                                      +
                                        +
                                      1. Start Docker by calling:

                                      2. +
                                      +
                                      sudo systemctl enable docker
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Install Scylla Monitoring Stack

                                      +

                                      Procedure

                                      +
                                        +
                                      1. Download and extract the latest Scylla Monitoring Stack binary;.

                                      2. +
                                      +
                                      wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.7.2.tar.gz
                                      +tar -xvf scylla-monitoring-4.7.2.tar.gz
                                      +cd scylla-monitoring-scylla-monitoring-4.7.2
                                      +
                                      +
                                      +

                                      As an alternative, you can clone and use the Git repository directly.

                                      +
                                      git clone https://github.com/scylladb/scylla-monitoring.git
                                      +cd scylla-monitoring
                                      +git checkout branch-4.7
                                      +
                                      +
                                      +
                                        +
                                      1. Start Docker service if needed

                                      2. +
                                      +
                                      sudo systemctl restart docker
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Configure Scylla Monitoring Stack

                                      +

                                      To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                                      +

                                      This configuration can be done from files, or using the Consul api.

                                      +

                                      Scylla Manager 2.0 and higher supports the Consul API.

                                      +
                                      +

                                      Configure Scylla nodes from files

                                      +
                                        +
                                      1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                                      2. +
                                      +
                                      +

                                      Note

                                      +

                                      It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                                      +
                                      +

                                      For example:

                                      +
                                      - targets:
                                      +      - 172.17.0.2
                                      +      - 172.17.0.3
                                      +  labels:
                                      +      cluster: cluster1
                                      +      dc: dc1
                                      +
                                      +
                                      +
                                      +

                                      Note

                                      +

                                      If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                                      +
                                      +

                                      Using IPV6

                                      +

                                      To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets.

                                      +

                                      For example:

                                      +
                                      - targets:
                                      +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]"
                                      +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]"
                                      +  labels:
                                      +      cluster: cluster1
                                      +      dc: dc1
                                      +
                                      +
                                      +
                                      +

                                      Note

                                      +

                                      For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                                      +
                                      +

                                      For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                                      +
                                      +

                                      Note

                                      +

                                      By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                                      +
                                      +

                                      If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                                      +

                                      For example:

                                      +
                                      ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                                      +
                                      +
                                      +

                                      Mark the different Data Centers with Labels.

                                      +

                                      As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                                      +

                                      You can use the genconfig.py script to generate the server file. For example:

                                      +
                                      ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                                      +
                                      +
                                      +

                                      This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                                      +

                                      OR

                                      +

                                      The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                                      +
                                      nodetool status | ./genconfig.py -NS
                                      +
                                      +
                                      +

                                      2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                                      +

                                      You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                                      +

                                      For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                                      +
                                      # List Scylla Manager end points
                                      +
                                      +- targets:
                                      +  - 172.17.0.7:5090
                                      +
                                      +
                                      +

                                      Note that you do not need to add labels to the Scylla Manager targets.

                                      +
                                      +
                                      +

                                      Configure Scylla nodes using Scylla-Manager Consul API

                                      +

                                      Scylla Manager 2.0 has a Consul like API.

                                      +

                                      When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                                      +

                                      For example:

                                      +
                                      ./start-all.sh -L 10.10.0.1
                                      +
                                      +
                                      +
                                      +

                                      Note

                                      +

                                      If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                                      +
                                      +
                                      +
                                      +

                                      Connecting Scylla-Monitoring to ScyllaDB

                                      +

                                      Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                                      +

                                      You can limit the user to read only, currently it only read table from the system keyspace.

                                      +

                                      You can set a user and password from a file or environment variables.

                                      +

                                      If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                                      +

                                      To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                                      +
                                      +

                                      Note

                                      +

                                      It is best to use a dedicated user and password with limited privileges.

                                      +
                                      +
                                      +
                                      +

                                      Use an external directory for the Prometheus data directory

                                      +

                                      The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                                      +
                                      +

                                      Note

                                      +

                                      Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                                      +
                                      +

                                      If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                                      +

                                      In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                                      +
                                      +
                                      +

                                      Add Additional Prometheus Targets

                                      +

                                      There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                                      +

                                      The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                                      +

                                      You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                                      +
                                      - job_name: 'myservice'
                                      +  # Override the global default and scrape targets from this job every 5 seconds.
                                      +  scrape_interval: 5s
                                      +  static_configs:
                                      +    - targets:
                                      +      - 17.0.0.1:7000
                                      +
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Start and Stop Scylla Monitoring Stack

                                      +
                                      +

                                      Start

                                      +
                                      ./start-all.sh -d prometheus_data
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Stop

                                      +
                                      ./kill-all.sh
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Start a Specific Scylla Monitoring Stack Version

                                      +

                                      By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                                      +

                                      You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                                      +

                                      Multiple versions are supported. For example:

                                      +
                                      ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                                      +
                                      +
                                      +

                                      will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                                      +
                                      +
                                      +

                                      Accessing the localhost

                                      +

                                      The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                                      +
                                      ./start-all.sh -l -d prometheus-data
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Configure rsyslog on each Scylla node

                                      +

                                      generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                                      +

                                      Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                                      +

                                      Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                                      +

                                      If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                                      +
                                      if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                                      +
                                      +
                                      +

                                      Restart rsyslog for the configuration to take effect.

                                      +
                                      systemctl restart rsyslog
                                      +
                                      +
                                      +
                                      +
                                      +
                                      +

                                      View Grafana Dashboards

                                      +

                                      Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/install/monitoring_stack.html b/stable/install/monitoring_stack.html new file mode 100644 index 000000000..eab0c95d6 --- /dev/null +++ b/stable/install/monitoring_stack.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/install/start-all.html b/stable/install/start-all.html new file mode 100644 index 000000000..e594912be --- /dev/null +++ b/stable/install/start-all.html @@ -0,0 +1,761 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      The start-all.sh Command

                                      +

                                      Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                                      +

                                      The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                                      +
                                      +

                                      General Options

                                      +

                                      -h Help, Print the help, and exit.

                                      +

                                      –version print the current Scylla-Monitoring stack version, and exit.

                                      +

                                      -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                                      +

                                      -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                                      +

                                      -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                                      +

                                      –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                                      +

                                      –compose This is an experimental option. When set, it initiates a two-stage process. Firstly, a docker-compose.yml file is created along with an .env file. Following this, the script executes docker-compose up. Please note that having docker-compose is a prerequisite.

                                      +
                                      + + +
                                      +

                                      Alert Manager

                                      +

                                      The Alertmanager handles the alerts and takes the following parameters:

                                      +

                                      -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                                      +

                                      -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                                      +

                                      -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/install/start_all.html b/stable/install/start_all.html new file mode 100644 index 000000000..f4d817f91 --- /dev/null +++ b/stable/install/start_all.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/install/thanos.html b/stable/install/thanos.html new file mode 100644 index 000000000..9952415fa --- /dev/null +++ b/stable/install/thanos.html @@ -0,0 +1,760 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Using Thanos as Data Source With Scylla Monitoring Stack

                                      +

                                      Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                                      +
                                        +
                                      • High-availability.

                                      • +
                                      • Horizontal scaling.

                                      • +
                                      • Backup.

                                      • +
                                      +

                                      The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                                      +

                                      The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                                      +
                                      +

                                      Using Thanos As a Prometheus Aggregator

                                      +

                                      There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                                      +
                                      +

                                      Prometheus Configuration

                                      +

                                      We will assume you have two Prometheus servers running.

                                      +
                                        +
                                      1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                                      2. +
                                      3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                                      4. +
                                      +
                                      +
                                      +

                                      Thanos sidecar

                                      +

                                      The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                                      +
                                      docker run -d \
                                      + -v /path/to/prom/dir:/data/prom:z \
                                      + -i --name sidecar thanosio/thanos \
                                      + sidecar \
                                      + --grpc-address=0.0.0.0:10911 \
                                      + --grpc-grace-period=1s \
                                      + --http-address=0.0.0.0:10912 \
                                      + --http-grace-period=1s \
                                      + --prometheus.url=http://prometheus-ip:9090 \
                                      + --tsdb.path=/data/prom \
                                      + -p 10912:10912 \
                                      + -p 10911:10911
                                      +
                                      +
                                      +

                                      After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                                      +
                                      +
                                      +

                                      Thanos query

                                      +

                                      Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                                      +
                                      docker run -d \
                                      + --name thanos -- thanosio/thanos \
                                      +   query \
                                      +   --debug.name=query0 \
                                      +   --log.level=debug \
                                      +   --grpc-address=0.0.0.0:10903 \
                                      +   --grpc-grace-period=1s \
                                      +   --http-address=0.0.0.0:10904 \
                                      +   --http-grace-period=1s \
                                      +   --query.replica-label=prometheus \
                                      +   --store={ip1}:10911 --store={ip2}:10911
                                      +
                                      +
                                      +

                                      After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                                      +
                                      +
                                      +

                                      Update Scylla Data source

                                      +

                                      The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                                      +

                                      The file you edit is a template file that replaces the file Grafana uses, next time you start.

                                      +

                                      Restart the Scylla Monitoring Stack it should now use Thanos.

                                      +
                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/intro.html b/stable/intro.html new file mode 100644 index 000000000..30ae89360 --- /dev/null +++ b/stable/intro.html @@ -0,0 +1,709 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      ScyllaDB Monitoring Stack

                                      +

                                      ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                      +_images/monitor.png +

                                      The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                                      +
                                        +
                                      • prometheus - Collects and stores metrics

                                      • +
                                      • grafan-loki - Parses logs and generates metrics and alerts

                                      • +
                                      • alertmanager - Handles alerts

                                      • +
                                      • grafana - Dashboards server

                                      • +
                                      +

                                      A few optional components are used for additional services

                                      +
                                        +
                                      • grafana-image-renderer - Allows you to download a dashboard as an image.

                                      • +
                                      • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                                      • +
                                      +
                                      +

                                      High Level Architecture

                                      +_images/monitoring_stack1.png +

                                      We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                                      +

                                      We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                                      +

                                      The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                                      +

                                      We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                                      +

                                      Choose a topic to get started:

                                      + +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/objects.inv b/stable/objects.inv new file mode 100644 index 000000000..0e3f04744 Binary files /dev/null and b/stable/objects.inv differ diff --git a/stable/procedures/alerts/alerting.html b/stable/procedures/alerts/alerting.html new file mode 100644 index 000000000..0f8bdd54e --- /dev/null +++ b/stable/procedures/alerts/alerting.html @@ -0,0 +1,778 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Alerting

                                      +

                                      Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                                      +

                                      You can read more about Prometheus alerting here

                                      +

                                      By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                                      +

                                      In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                                      +

                                      The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                                      +../../_images/monitoring_stack.png +
                                      +

                                      Prometheus Alerts

                                      +

                                      The Prometheus alerts are defined in files placed under prometheus/prom_rules/. Prometheus will load any file that ends with yml or yaml.

                                      +

                                      Each Prometheus alert consists of:

                                      +
                                        +
                                      • Name

                                      • +
                                      • What happened

                                      • +
                                      • For how long

                                      • +
                                      • What to report

                                      • +
                                      +

                                      For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                                      +
                                      - alert: InstanceDown
                                      +  expr: up == 0
                                      +  for: 60s
                                      +  labels:
                                      +    severity: "error"
                                      +  annotations:
                                      +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                                      +    summary: Instance {{ $labels.instance }} down
                                      +
                                      +
                                      +

                                      The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                                      +

                                      The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                                      +

                                      The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to error.

                                      +

                                      annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                                      +
                                      +

                                      Alerts severity

                                      +

                                      Prometheus uses the following severities from low to high: info, warn, error, critical.

                                      +

                                      The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the error alert for disk-full is firing, it silences the warn alert.

                                      +

                                      When adding your own alerts, you can use the severities to signal the action’s importance, for example critical would be a pager-duty, while an error will be an email.

                                      +
                                      +
                                      +

                                      Adding Alerts

                                      +

                                      Add your own alerts in a separate file with a yml or yaml extension. Making it easier during upgrade.

                                      +
                                      +
                                      +

                                      Modifying Alerts

                                      +

                                      It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade.

                                      +
                                      +
                                      +
                                      +

                                      Alertmanager

                                      +

                                      The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                                      +

                                      The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                                      +
                                        +
                                      • Routes: Represent a routing tree, the most specific rule, wins

                                      • +
                                      • Inhibition: Mute an alert, based on another alert

                                      • +
                                      • Receiver: Send a notification via email, sluck, etc’

                                      • +
                                      +

                                      Check the Alertmanager documentation for details on how to specify a specific receiver.

                                      +

                                      In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                                      +
                                      +
                                      +

                                      Tips When Adding an Alert

                                      +

                                      It’s worse having an alert that does not work, than not having an alert at all

                                      +

                                      There are multiple ways you can use to make sure your alert is set correctly:

                                      +
                                        +
                                      • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                                      • +
                                      • Force the alert to be active by reducing the limits or the duration.

                                      • +
                                      • When possible simulate the actual scenario and see that the alert works as expected.

                                      • +
                                      +

                                      For example, low available disk space.

                                      +

                                      Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                                      +

                                      Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                                      +

                                      Starting with a simple working expression helps you bisect problems.

                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/procedures/alerts/index.html b/stable/procedures/alerts/index.html new file mode 100644 index 000000000..01e35a5d8 --- /dev/null +++ b/stable/procedures/alerts/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Scylla Monitoring Stack Alert Manager

                                      +
                                      +
                                      +

                                      Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/procedures/datadog/cloud-integration.html b/stable/procedures/datadog/cloud-integration.html new file mode 100644 index 000000000..541a090c5 --- /dev/null +++ b/stable/procedures/datadog/cloud-integration.html @@ -0,0 +1,741 @@ + + + + + + + + + + + + + ScyllaDB Cloud Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      ScyllaDB Cloud Monitoring Datadog Integration

                                      +

                                      To allow external server scrapping, you will need to enable the Prometheus proxy. +The Datadog agent reads from the proxy, which reads from the Promethues server.

                                      +
                                        +
                                      1. Installing and configuring the Datadog Agent.

                                      2. +
                                      3. Add Datadog recording rules.

                                      4. +
                                      5. Loading ScyllaDB dashboard to Datadog.

                                      6. +
                                      7. Optionally load Monitor (Alerts).

                                      8. +
                                      +
                                      +

                                      ScyllaDB Monitoring Datadog Integration Overview

                                      +

                                      A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog.

                                      +

                                      Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those.

                                      +
                                      +
                                      +

                                      Install And configure the Datadog Agent

                                      +

                                      Start by installing DataDog Agent on a server with access to ScyllaDB Cloud Prometheus Proxy server, following Installation guide. +The datadog agent should run on a machine that can reach the Prometheus Proxy server.

                                      +

                                      Once the Datadog agent is working, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                      +

                                      Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                                      +
                                      +

                                      Post configuration

                                      +

                                      Restart the agent based on your installation. ScyllaDB metrics should be visible in Datadog.

                                      +
                                      +

                                      Note

                                      +

                                      By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                                      +
                                      +
                                      +
                                      +
                                      +

                                      Upload the Dashboard

                                      +

                                      Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                                      +
                                      +
                                      +

                                      Using the Dashboard

                                      +

                                      We created a Datadog dashboard that resembles the Grafana dashboards.

                                      +../../_images/datadog.png +

                                      The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                                      +
                                      +

                                      Note

                                      +

                                      Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                                      +
                                      +
                                      +
                                      +

                                      Adding Monitor

                                      +

                                      Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/procedures/datadog/index.html b/stable/procedures/datadog/index.html new file mode 100644 index 000000000..92dcbc3d4 --- /dev/null +++ b/stable/procedures/datadog/index.html @@ -0,0 +1,762 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Scylla Monitoring Datadog Integration

                                      +

                                      The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                                      +
                                        +
                                      1. Installing and configuring the Datadog Agent.

                                      2. +
                                      3. Add Datadog recording rules.

                                      4. +
                                      5. Loading Scylla dashboard to Datadog.

                                      6. +
                                      7. Optionally load Monitor (Alerts).

                                      8. +
                                      +
                                      +

                                      Note

                                      +

                                      Scylla Cloud users, Check the cloud users specific guide.

                                      +
                                      +
                                      +

                                      Scylla Monitoring Datadog Integration Overview

                                      +

                                      A typical ScyllaDB cluster generates thousands of metrics, sometimes even tens of thousands. +The sheer number of metrics is too much for Datadog.

                                      +

                                      Instead of letting the Datadog agent scrap all metrics, the monitoring stack marks a small subset of metrics with a label and lets the Datadog agent scrap only those. +That labeling is done in two places: recording rules and the Prometheus relabel config.

                                      +

                                      Recording rules aggregate the metrics so that they will be reported per instance instead of per shard, and they mark the result with a label.

                                      +

                                      Prometheus relabel config marks metrics that are reported per instance, like disk and CPU.

                                      +
                                      +
                                      +

                                      Install And configure the Datadog Agent

                                      +

                                      Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                                      +

                                      Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml +Download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                                      +
                                      +

                                      Post configuration

                                      +

                                      Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                                      +
                                      +

                                      Note

                                      +

                                      By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                                      +
                                      +
                                      +
                                      +
                                      +

                                      Add datadog recording rules

                                      +

                                      Download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                                      +
                                      +
                                      +

                                      Upload the Dashboard

                                      +

                                      Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                                      +
                                      +
                                      +

                                      Using the Dashboard

                                      +

                                      We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                                      +../../_images/datadog.png +

                                      The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                                      +
                                      +

                                      Note

                                      +

                                      Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                                      +
                                      +
                                      +
                                      +

                                      Adding Monitor

                                      +

                                      Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                                      +
                                      +
                                      +

                                      Adding more metrics to Datadog

                                      +

                                      To add a missing metric, do the following:

                                      +

                                      For ScyllaDB metrics, add a recording rule to report an aggregated per instance of that metric. We suggest placing it in a different YAML file to simplify an upgrade.

                                      +

                                      OS-related metrics originate from node_exporter, and Prometheus labels them during scraping. +To label a node exporter metrics, edit the prometheus/prometheus.yml.template search for the job_name: node_exporter and find the metric_relabel_configs. +You can add a metric name to the regex section.

                                      +

                                      If you think that metric is helpful for other users, open an issue, and we’ll add it.

                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/procedures/index.html b/stable/procedures/index.html new file mode 100644 index 000000000..6ba58d207 --- /dev/null +++ b/stable/procedures/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      ScyllaDB Monitoring Stack Procedures

                                      +
                                      +
                                      +

                                      There are several reference guides available which give additional information. Choose a topic to begin:

                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/procedures/updating-dashboard.html b/stable/procedures/updating-dashboard.html new file mode 100644 index 000000000..ec13a118f --- /dev/null +++ b/stable/procedures/updating-dashboard.html @@ -0,0 +1,966 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Adding and Modifying Dashboards

                                      +

                                      This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                                      +

                                      It covers dashboard templates and how to modify them.

                                      + +
                                      +

                                      General Limitations

                                      +

                                      Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                                      +
                                      +

                                      Consistency Between Restarts

                                      +

                                      By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                                      +
                                      +
                                      +

                                      Consistency Between Upgrades

                                      +

                                      As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                                      +
                                      +

                                      Note

                                      +

                                       You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                                      +
                                      +

                                      At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                                      +
                                      +
                                      +
                                      +

                                      Using Templated Dashboards

                                      +

                                      Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                                      +

                                      Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                                      +

                                      For example a typical graph panel would look like this:

                                      +
                                      {
                                      +    "aliasColors": {},
                                      +    "bars": false,
                                      +    "datasource": "prometheus",
                                      +    "editable": true,
                                      +    "error": false,
                                      +    "fill": 0,
                                      +    "grid": {
                                      +        "threshold1": null,
                                      +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                                      +        "threshold2": null,
                                      +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                                      +    },
                                      +    "gridPos": {
                                      +        "h": 6,
                                      +        "w": 10,
                                      +        "x": 0,
                                      +        "y": 4
                                      +    },
                                      +    "id": 2,
                                      +    "isNew": true,
                                      +    "legend": {
                                      +        "avg": false,
                                      +        "current": false,
                                      +        "max": false,
                                      +        "min": false,
                                      +        "show": false,
                                      +        "total": false,
                                      +        "values": false
                                      +    },
                                      +    "lines": true,
                                      +    "linewidth": 2,
                                      +    "links": [],
                                      +    "nullPointMode": "connected",
                                      +    "percentage": false,
                                      +    "pointradius": 5,
                                      +    "points": false,
                                      +    "renderer": "flot",
                                      +    "seriesOverrides": [
                                      +        {}
                                      +    ],
                                      +    "span": 5,
                                      +    "stack": false,
                                      +    "steppedLine": false,
                                      +    "targets": [
                                      +        {
                                      +            "expr": "sum(node_filesystem_avail) by (instance)",
                                      +            "intervalFactor": 1,
                                      +            "legendFormat": "",
                                      +            "refId": "A",
                                      +            "step": 1
                                      +        }
                                      +    ],
                                      +    "timeFrom": null,
                                      +    "timeShift": null,
                                      +    "title": "Available Disk Size",
                                      +    "tooltip": {
                                      +        "msResolution": false,
                                      +        "shared": true,
                                      +        "sort": 0,
                                      +        "value_type": "cumulative"
                                      +    },
                                      +    "transparent": false,
                                      +    "type": "graph",
                                      +    "xaxis": {
                                      +        "show": true
                                      +    },
                                      +    "yaxes": [
                                      +        {
                                      +            "format": "percent",
                                      +            "logBase": 1,
                                      +            "max": 101,
                                      +            "min": 0,
                                      +            "show": true
                                      +        },
                                      +        {
                                      +            "format": "short",
                                      +            "logBase": 1,
                                      +            "max": null,
                                      +            "min": null,
                                      +            "show": true
                                      +        }
                                      +    ]
                                      +}
                                      +
                                      +
                                      +

                                      As you can imagine, most panels would have similar values.

                                      +

                                      To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                                      +
                                      +

                                      The Template Class System

                                      +

                                      The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                                      +

                                      The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                                      +

                                      In the template file, you can also add or override attributes.

                                      +

                                      The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                                      +

                                      When generating dashboards, each class will be replaced by its definition.

                                      +

                                      For example, a row in the type.json is defined as:

                                      +
                                      {
                                      + "base_row": {
                                      +     "collapse": false,
                                      +     "editable": true
                                      + },
                                      + "row": {
                                      +     "class": "base_row",
                                      +     "height": "250px"
                                      + }
                                      + }
                                      +
                                      +
                                      +

                                      Will be used like in a template:

                                      +
                                      {
                                      +     "class": "row",
                                      +     "height": "150px",
                                      +     "panels": [
                                      +     ]
                                      +}
                                      +
                                      +
                                      +

                                      And the output will be:

                                      +
                                      {
                                      +     "class": "row",
                                      +     "collapse": false,
                                      +     "editable": true,
                                      +     "height": "150px",
                                      +     "panels": [
                                      +
                                      +     ]
                                      +}
                                      +
                                      +
                                      +

                                      We can see that the template added the panels attribute and that it overrides the height attribute.

                                      +
                                      +
                                      +

                                      Panel Example

                                      +

                                      Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                                      +
                                      {
                                      +     "class": "row",
                                      +     "panels": [
                                      +         {
                                      +             "class": "bytes_panel",
                                      +             "span": 3,
                                      +             "targets": [
                                      +                 {
                                      +                     "expr": "sum(node_filesystem_avail) by (instance)",
                                      +                     "intervalFactor": 1,
                                      +                     "legendFormat": "",
                                      +                     "metric": "",
                                      +                     "refId": "A",
                                      +                     "step": 1
                                      +                 }
                                      +             ],
                                      +             "title": "Available Disk Size"
                                      +         }
                                      +     ]
                                      +}
                                      +
                                      +
                                      +

                                      In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                                      +

                                      You can also see that the span attribute is overridden to set the panel size.

                                      +

                                      To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                                      +
                                      +
                                      +

                                      Grafana Formats and Layouts

                                      +

                                      The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                                      +

                                      Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                                      +

                                      The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                                      +

                                      To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                                      +

                                      The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                                      +

                                      You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                                      +

                                      gridPos has the following attributes:

                                      +
                                      {
                                      +   "x": 0,
                                      +   "y": 0,
                                      +   "w": 24,
                                      +   "h": 4
                                      + }
                                      +
                                      +
                                      +

                                      When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                                      +
                                      {
                                      +   "gridPos": {
                                      +      "h": 2
                                      +    }
                                      +}
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Generating the dashboards from templates (generate-dashboards.sh)

                                      +
                                      +

                                      Prerequisite

                                      +

                                      Python 3 +pyyaml

                                      +

                                      make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                                      +

                                      Use the -h flag to get help information.

                                      +

                                      You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                                      +

                                      When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                                      +

                                      For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                                      +

                                      .\generate-dashboards.sh -v 2020.1

                                      +
                                      +

                                      Note

                                      +

                                      generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                                      +
                                      +
                                      +
                                      +
                                      +

                                      Validation

                                      +

                                      After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                                      +

                                      Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                                      +
                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/procedures/updating_dashboard.html b/stable/procedures/updating_dashboard.html new file mode 100644 index 000000000..9f5ed39d1 --- /dev/null +++ b/stable/procedures/updating_dashboard.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/reference/index.html b/stable/reference/index.html new file mode 100644 index 000000000..4f70f918e --- /dev/null +++ b/stable/reference/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Scylla Monitoring Stack Reference Guide

                                      +
                                      +
                                      +

                                      There are several reference guides available which give additional information. Choose a topic to begin:

                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/reference/matrix.html b/stable/reference/matrix.html new file mode 100644 index 000000000..6ac511196 --- /dev/null +++ b/stable/reference/matrix.html @@ -0,0 +1,867 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Scylla Monitoring Stack Support Matrix

                                      +

                                      The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                                      + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                                      Scylla Monitoring Stack Version

                                      Scylla Open Source Version

                                      Scylla Enterprise Version

                                      Node_exporter[1] Version

                                      Scylla Manager Version

                                      4.7

                                      5.2, 5.4, 6.0

                                      2022.1, 2022.2, 2023.1, 2024.1

                                      1.7.0

                                      3.2

                                      4.6

                                      5.2, 5.4

                                      2021.1, 2022.1, 2022.2, 2023.1, 2024.1

                                      1.4.1

                                      3.0, 3.1, 3.2

                                      4.5

                                      5.0,5.1,5.2,5.4

                                      2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                      1.4.1

                                      3.0, 3.1, 3.2

                                      4.4.5

                                      5.0,5.1,5.2,5.4

                                      2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                      1.4.1

                                      3.0, 3.1, 3.2

                                      4.4

                                      5.0,5.1,5.2

                                      2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                      1.4.1

                                      3.0, 3.1

                                      4.3

                                      5.0,5.1,5.2

                                      2020.1, 2021.1, 2022.1, 2022.2

                                      1.4.1

                                      2.5, 2.6, 3.0

                                      4.2

                                      4.5,4.6,5.0,5.1

                                      2020.1, 2021.1, 2022.1, 2022.2

                                      1.4.1

                                      2.5, 2.6, 3.0

                                      4.1

                                      4.5,4.6,5.0,5.1

                                      2020.1, 2021.1, 2022.1, 2022.2

                                      0.17

                                      2.5, 2.6, 3.0

                                      4.0

                                      4.3, 4.4, 4.5, 4.6, 5.0

                                      2020.1, 2021.1, 2022.1

                                      0.17

                                      2.3, 2.4, 2.5, 2.6, 3.0

                                      3.11

                                      4.3, 4.4, 4.5, 4.6, 5.0

                                      2020.1, 2021.1, 2022.2

                                      0.17

                                      2.3, 2.4, 2.5, 2.6

                                      3.10

                                      4.3, 4.4, 4.5, 4.6

                                      2020.1, 2021.1

                                      0.17

                                      2.3, 2.4, 2.5, 2.6

                                      3.9

                                      4.3, 4.4, 4.5, 4.6

                                      2020.1, 2021.1

                                      0.17

                                      2.3, 2.4, 2.5

                                      3.8

                                      4.3, 4.4, 4.5

                                      2020.1, 2021.1

                                      0.17

                                      2.3, 2.4, 2.5

                                      3.7

                                      4.2, 4.3, 4.4

                                      2019.1, 2020.1, 2021.1

                                      0.17

                                      2.2, 2.3

                                      3.6.3

                                      4.2, 4.3, 4.4

                                      2019.1, 2020.1, 2021.1

                                      0.17

                                      2.2, 2.3, 2.1

                                      3.6

                                      4.1, 4.2, 4.3

                                      2019.1, 2020.1

                                      0.17

                                      2.1, 2.2, 2.3

                                      3.6.1

                                      4.1, 4.2, 4.3

                                      2019.1, 2020.1

                                      0.17

                                      2.1, 2.2

                                      3.6.1

                                      4.1, 4.2, 4.3, 4.4

                                      2019.1, 2020.1

                                      0.17

                                      2.1, 2.2

                                      3.5

                                      3.3, 4.0, 4.1, 4.2

                                      2019.1, 2020.1

                                      0.17

                                      2.0, 2.1, 2.2

                                      3.4.3

                                      3.3, 4.0, 4.1, 4.2

                                      2019.1, 2020.1

                                      0.17

                                      2.0, 2.1

                                      3.4

                                      3.3, 4.0, 4.1

                                      2018.1, 2019.1

                                      0.17

                                      2.0, 2.1

                                      3.3

                                      3.1, 3.2, 3.3, 4.0

                                      2018.1, 2019.1

                                      0.17

                                      1.4, 2.0, 2.1

                                      3.2

                                      3.1, 3.2, 3.3

                                      2018.1, 2019.1

                                      0.17

                                      1.4, 2.0

                                      3.1

                                      2.3, 3.0, 3.1, 3.2

                                      2018.1, 2019.1

                                      0.17

                                      1.3, 1.4, 2.0

                                      3.0

                                      2.3, 3.0, 3.1, 3.2

                                      2018.1, 2019.1

                                      0.17

                                      1.3, 1.4

                                      2.4

                                      2.3, 3.0, 3.1

                                      2018.1, 2019.1

                                      0.14, 0.17

                                      1.3, 1.4

                                      2.3

                                      2.3, 3.0

                                      2018.1, 2019.1

                                      0.14, 0.17

                                      1.3

                                      2.2

                                      2.3, 3.0

                                      2018.1, 2019.1

                                      0.14, 0.17

                                      1.3

                                      2.1

                                      2.3, 3.0

                                      2018.1

                                      0.14, 0.17

                                      1.3

                                      +

                                      [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/reference/monitoring-apis.html b/stable/reference/monitoring-apis.html new file mode 100644 index 000000000..b253b1c59 --- /dev/null +++ b/stable/reference/monitoring-apis.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Scylla Monitoring Stack Interfaces

                                      +

                                      Scylla exposes two interfaces for online monitoring, as described below

                                      +
                                      +

                                      Prometheus API

                                      +

                                      By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                                      +

                                      For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                                      +

                                      You can change the Prometheus listening address and port in scylla.yaml file

                                      +
                                      # prometheus port
                                      +# By default, Scylla opens prometheus API port on port 9180
                                      +# setting the port to 0 will disable the prometheus API.
                                      +prometheus_port: 9180
                                      +#
                                      +# prometheus address
                                      +# By default, Scylla binds all interfaces to the prometheus API
                                      +# It is possible to restrict the listening address to a specific one
                                      +prometheus_address: 0.0.0.0
                                      +
                                      +
                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/reference/monitoring_apis.html b/stable/reference/monitoring_apis.html new file mode 100644 index 000000000..801ff05b8 --- /dev/null +++ b/stable/reference/monitoring_apis.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/robots.txt b/stable/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/stable/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/stable/search.html b/stable/search.html new file mode 100644 index 000000000..932755c2b --- /dev/null +++ b/stable/search.html @@ -0,0 +1,652 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + + + +
                                      + + + + + +
                                      + + +
                                      + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/searchindex.js b/stable/searchindex.js new file mode 100644 index 000000000..633cbc865 --- /dev/null +++ b/stable/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/cloud-integration", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/cloud-integration.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "ScyllaDB Cloud Monitoring Datadog Integration", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "7": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "scylla": [0, 1, 2, 4, 7, 9, 10, 12, 14, 15, 27, 28, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "monitor": [0, 2, 4, 7, 10, 15, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "stack": [0, 2, 4, 7, 10, 12, 13, 15, 23, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "scylladb": [0, 2, 4, 5, 13, 19, 20, 22, 23, 24, 25, 26, 31, 32, 34, 36, 38, 39, 42], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 20, 22, 24, 28, 29, 30, 31, 34, 35, 36, 38, 40, 41, 42], "full": [0, 1, 3, 6, 9, 10, 28], "alert": [0, 1, 3, 5, 6, 9, 12, 13, 14], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 17, 20, 22, 24, 36, 38, 40], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 13, 15, 22, 31, 34, 40, 42], "open": [0, 1, 3, 5, 6, 9, 13, 17, 18, 21, 26], "sourc": [0, 1, 3, 5, 6, 9, 10, 17, 21, 22, 40], "tool": [0, 1, 3, 9, 20, 42], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 13, 15, 17, 20, 23, 24, 25, 26, 27, 42], "grafana": [0, 1, 3, 8, 9, 10, 12, 13, 23, 25, 26, 27], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 14, 17, 20, 23, 24, 25, 26, 27, 35, 42, 43], "consist": [1, 9, 10, 13, 22, 35], "three": [1, 2, 6, 10, 26], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 20, 22, 26], "collect": [1, 5, 6, 7, 8, 9, 20, 24, 26, 36, 38], "store": [1, 5, 8, 9, 15, 23, 25, 26, 27, 29, 30, 40], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 15, 17, 22, 23, 24, 25, 27, 42], "alertmanag": [1, 2, 7, 9, 23, 25, 26, 27], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 18, 22, 28, 42], "choos": [1, 3, 9, 11, 12, 13, 14, 16, 19, 20, 43], "topic": [1, 3, 9, 11, 14, 16, 19, 43], "get": [1, 6, 8, 9, 10, 15, 26, 29, 39, 40, 41, 42], "start": [1, 3, 5, 8, 9, 10, 12, 13, 15, 22, 23, 24, 25, 27, 34], "user": [1, 2, 6, 7, 9, 13, 14, 28, 42], "guid": [1, 6, 9, 12, 13, 14, 20, 21], "download": [1, 5, 6, 9, 12, 13, 22, 23, 24, 25, 26, 27], "instal": [1, 2, 9, 20], "procedur": [1, 5, 6, 9, 20, 21], "troubleshoot": [1, 9], "refer": [1, 6, 9, 14], "upgrad": [1, 10, 13, 14], "lesson": [1, 9, 29, 30, 31], "univers": [1, 9], "github": [1, 5, 6, 23, 25, 26, 27], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 13, 15, 26, 28, 42], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 19, 20, 22, 23, 24, 25, 26, 27, 31, 33, 34, 41, 42, 43], "can": [2, 5, 6, 7, 8, 10, 12, 13, 15, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 31, 34, 35, 42, 43], "all": [2, 3, 5, 6, 8, 10, 12, 13, 15, 18, 20, 22, 24, 28, 32, 35, 42], "sh": [2, 3, 6, 20, 22, 23, 24, 25, 26, 27], "kill": [2, 6, 20, 22, 24], "script": [2, 3, 6, 7, 15, 24], "an": [2, 4, 5, 7, 8, 9, 13, 15, 20, 22, 24, 26, 33, 35, 36, 38, 40, 42], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 15, 18, 22, 26], "requir": [2, 8, 29, 32, 36, 42], "more": [2, 4, 5, 6, 10, 15, 18, 20, 28, 31, 34, 36, 39, 42], "manual": [2, 20], "step": [2, 8, 15, 20, 22, 23, 24, 25, 26, 27], "onc": [2, 12, 13, 22, 26, 33, 40, 42], "configur": [2, 7, 10, 15, 18, 20, 22, 34, 35], "simplifi": [2, 13], "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 22, 23, 24, 25, 26, 27, 34, 35, 36, 37, 40, 41, 42, 43], "two": [2, 6, 7, 8, 13, 15, 18, 22, 25, 26, 27, 40, 42], "wai": [2, 5, 7, 10, 13, 20, 26, 42], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 13, 15, 20, 22, 24, 25, 26, 27, 28, 29, 32, 33, 39, 42], "one": [2, 6, 7, 18, 20, 22, 23, 24, 25, 26, 27, 29, 31, 32, 34, 36, 42], "both": [2, 5, 6, 13, 20, 23, 25, 26, 27, 42], "In": [2, 6, 10, 15, 20, 22, 26, 34, 42], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 13, 15, 20, 28, 40, 42], "updat": [2, 5, 10, 15, 20, 22], "yml": [2, 5, 6, 7, 8, 10, 13, 20, 22, 23, 24, 25, 26, 27, 34, 42], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 13, 15, 20, 22, 23, 25, 26, 27, 30, 34, 36, 41, 42], "make": [2, 5, 6, 7, 8, 10, 15, 20, 22, 23, 24, 25, 26, 27, 42], "sure": [2, 5, 6, 8, 10, 15, 20, 22, 23, 24, 25, 26, 27, 42], "have": [2, 4, 5, 6, 7, 8, 10, 15, 20, 25, 26, 27], "among": [2, 35], "other": [2, 8, 9, 10, 13], "ip": [2, 5, 6, 7, 8, 13, 18, 20, 22, 23, 25, 26, 27], "address": [2, 5, 6, 7, 8, 13, 18, 20, 22], "either": [2, 6], "locat": [2, 7, 10, 22, 24, 35], "scylla_serv": [2, 5, 6, 20, 22, 23, 24, 25, 26, 27, 42], "consul": [2, 7], "manag": [2, 5, 14, 17, 19, 27], "config": [2, 5, 7, 13], "gener": [2, 5, 6, 9, 10, 12, 13, 42], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 13, 20, 22, 23, 24, 25, 26, 27, 35, 36, 42], "For": [2, 4, 5, 6, 7, 10, 12, 13, 15, 18, 20, 22, 26, 35, 36, 39, 42], "product": [2, 7], "system": [2, 7, 9, 10, 11, 20, 23, 25, 26, 27, 29, 34, 35, 42], "advis": [2, 35, 42], "extern": [2, 5, 7, 8, 10, 12, 15, 20, 23, 25, 26, 27, 42], "directori": [2, 5, 7, 8, 10, 15, 22, 23, 24, 25, 26, 27], "databas": [2, 5, 7, 22, 31, 42], "accordingli": [2, 12, 13], "see": [2, 4, 5, 6, 10, 12, 13, 15, 18, 20, 22, 23, 24, 25, 26, 27, 34, 42], "below": [2, 5, 6, 10, 15, 18, 20], "read": [2, 5, 6, 8, 9, 10, 12, 20, 22, 27, 28, 32, 34], "its": [2, 5, 6, 7, 8, 9, 15, 22], "from": [2, 5, 7, 8, 9, 10, 12, 13, 22, 23, 24, 25, 26, 27, 28, 37, 42], "note": [2, 5, 6, 7, 20, 22, 23, 25, 26, 27], "latter": 2, "tell": 2, "where": [2, 5, 6, 15, 20, 22, 26, 42], "themselv": [2, 15], "which": [2, 8, 12, 14, 15, 16, 17, 20, 34, 36, 38, 40, 42], "differ": [2, 5, 6, 7, 8, 10, 13, 15, 22, 23, 24, 25, 26, 27, 33, 42], "run": [2, 3, 5, 6, 7, 8, 9, 12, 13, 15, 17, 20, 22, 24, 34, 41], "follow": [2, 4, 5, 6, 7, 10, 12, 13, 15, 17, 20, 22, 23, 25, 26, 27, 34, 42], "command": [2, 6, 8, 20, 22, 23, 25, 26, 27, 34], "datasourc": [2, 5, 6, 8, 15], "under": [2, 5, 6, 10, 13, 26], "yaml": [2, 5, 10, 12, 13, 18], "To": [2, 4, 5, 6, 12, 13, 15, 18, 22, 23, 24, 25, 26, 27], "sashboard": 2, "t": [2, 15, 26], "line": [2, 5, 6, 7, 8, 15, 22, 26, 34], "flag": [2, 6, 7, 8, 15, 20, 22, 23, 25, 26, 27], "v": [2, 6, 7, 8, 15, 20], "specifi": [2, 6, 7, 10, 15, 20, 22, 27, 34], "version": [2, 5, 7, 15, 17, 20], "enterpris": [2, 6, 15, 17], "2020": [2, 6, 15, 17], "1": [2, 5, 6, 7, 8, 12, 13, 15, 17, 21, 23, 25, 26, 27], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 13, 15, 20, 22, 23, 24, 25, 26, 27, 28, 29, 32, 34, 37, 41, 42], "your": [2, 5, 6, 7, 8, 10, 11, 12, 13, 15, 18, 20, 22, 23, 25, 26, 27, 29, 30, 31, 42], "pass": [2, 6, 7, 22], "call": [2, 6, 7, 12, 13], "servic": [2, 5, 6, 7, 9, 20], "container_nam": 2, "aalert": 2, "imag": [2, 9, 20], "prom": [2, 8, 20], "v0": [2, 5], "26": [2, 5], "0": [2, 5, 6, 7, 8, 10, 15, 17, 18, 22, 23, 24, 25, 26, 27], "port": [2, 5, 6, 7, 18, 20, 22, 23, 25, 26], "9093": [2, 5], "volum": [2, 4, 5, 6, 23, 25, 26, 27], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 13, 15, 20, 26], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 15, 24, 34], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 15], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 15, 20, 23, 25, 26, 27], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 26, 35], "json": [2, 12, 13, 15], "10": [2, 5, 6, 10, 15, 17], "3000": [2, 5, 6, 23, 25, 26, 27], "1000": [2, 34], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 15, 30, 36, 38, 42], "path": [2, 5, 6, 7, 8, 10, 22, 23, 24, 25, 26, 27], "dir": [2, 7, 8, 23, 25, 26, 27], "loki": [2, 6, 9], "mnt": 2, "9": [2, 6, 17, 26], "5": [2, 5, 6, 15, 17, 20, 27], "3100": [2, 5], "rule": [2, 5, 7, 10, 12, 20, 26, 33, 41], "conf": [2, 5, 6, 12, 13], "promotheu": 2, "aprom": [2, 20, 26], "v2": [2, 5], "51": [2, 20], "9090": [2, 5, 8, 20, 26], "prom_rul": [2, 5, 10, 13, 26], "instead": [2, 5, 6, 8, 12, 13, 20, 26, 42], "target": [2, 5, 7, 15, 18, 20, 22, 24, 27], "place": [2, 6, 7, 8, 10, 13, 15, 42], "mount": 2, "If": [2, 5, 6, 7, 8, 12, 13, 15, 20, 22, 24, 26, 27, 34, 37, 39, 40, 41, 42], "do": [2, 5, 6, 7, 13, 15, 20, 22, 23, 24, 25, 26, 27, 31, 34, 42], "delet": 2, "afterward": 2, "d": [2, 5, 6, 7, 8, 12, 13, 22, 23, 24, 25, 26, 27], "scylla_manager_serv": [2, 5, 6, 20, 22, 24, 25, 26, 27], "node_exporter_serv": [2, 5, 6, 22, 23], "promtail": [2, 5], "3": [2, 4, 5, 6, 15, 17, 21, 36], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 4, 5, 6, 7, 10, 20, 22, 26, 42], "down": [2, 10, 20, 22, 23, 25, 26, 27, 29, 34, 36], "begin": [3, 11, 14, 16, 19, 43], "deploi": [3, 6], "without": [3, 6, 7, 15, 20, 22, 26, 27], "us": [3, 4, 7, 9, 10, 11, 20, 22, 23, 24, 25, 26, 27, 31, 35, 36, 38, 40, 42], "compos": [3, 7], "thano": [3, 9], "cpu": [4, 5, 6, 13, 41], "cluster": [4, 5, 6, 12, 13, 20, 26, 42], "100": [4, 5, 6, 26, 34, 41], "core": [4, 5, 6, 20, 26], "2vcpu": [4, 5, 6], "larger": [4, 5, 6, 15], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 12, 13, 23, 25, 26, 34, 36, 40], "storag": [4, 5, 6, 7, 9, 15, 26], "retent": [4, 5, 6, 22, 26], "period": [4, 5, 6, 8, 10, 20, 22, 34, 40], "section": [4, 5, 6, 10, 12, 13, 20, 22, 25, 26, 27, 42], "network": [4, 5, 6, 7, 20], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 20], "perform": [4, 5, 6, 20, 26, 34, 35, 39, 42], "block": [4, 5, 6, 26], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 26, 31, 35, 36, 38, 42], "default": [4, 5, 6, 7, 10, 12, 13, 15, 18, 20, 22, 24, 26, 27, 32, 42], "15": [4, 5, 6, 22, 26], "dai": [4, 5, 6, 7, 22, 26], "around": [4, 5, 6, 20], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 13, 20, 42], "assum": [4, 5, 6, 7, 8, 10, 23, 25, 26, 27], "scrape": [4, 5, 6, 13], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 39], "6": [4, 5, 6, 15, 17], "node": [4, 5, 7, 12, 13, 17, 20, 22, 29, 30, 31, 35, 36, 38, 39, 42], "each": [4, 5, 7, 8, 9, 10, 15, 17, 20, 27, 29, 31, 35, 40, 42], "16": [4, 5, 6, 20], "so": [4, 5, 6, 7, 8, 10, 13, 15, 20, 22, 26, 31, 42], "total": [4, 5, 6, 8, 15, 26], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 22, 24, 33, 40, 42], "need": [4, 5, 6, 7, 8, 10, 12, 13, 15, 20, 26, 29, 30, 31, 41, 42], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 13, 15, 20, 37, 41, 42], "replac": [4, 5, 6, 8, 12, 13, 15, 23, 25, 26, 27], "ad": [4, 5, 6, 7, 14], "we": [4, 5, 6, 8, 9, 12, 13, 15, 23, 25, 26, 27, 42], "alloc": [4, 5, 6], "least": [4, 5, 6, 26], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 15, 20, 22, 26, 29, 34, 42], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 15, 20, 40, 42], "fast": [4, 5, 6, 41], "enough": [4, 5, 6, 41], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 15, 20, 22, 26, 29, 35, 42], "out": [4, 5, 6, 8, 10, 41], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 35, 36, 38], "over": [4, 5, 6, 26], "longer": [4, 5, 6, 15, 22, 24, 26], "durat": [4, 5, 6, 7, 10, 26], "e": [4, 5, 6, 15, 26], "g": [4, 5, 6, 7, 22, 23, 25, 26, 27], "look": [4, 5, 6, 8, 10, 12, 13, 15, 26, 42], "week": [4, 5, 6, 7, 26], "view": [4, 5, 12, 13], "would": [4, 5, 6, 8, 10, 15, 22, 26, 28, 31, 42], "take": [4, 5, 6, 7, 15, 20, 22, 26], "than": [4, 5, 6, 10, 15, 22, 26, 42], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 26, 35], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 20, 24, 36], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 12, 15, 18, 22, 27, 42], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 23, 25, 26, 27], "help": [5, 7, 10, 13, 15, 42], "pleas": [5, 7, 20], "most": [5, 10, 15, 26, 37, 42], "common": [5, 7, 10, 42], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 10, 20], "standalon": [5, 20], "thei": [5, 6, 7, 10, 13, 15, 39, 40], "alreadi": [5, 23, 25, 26, 27], "consolid": 5, "suggest": [5, 13, 15, 26], "those": [5, 12, 13, 26, 27], "offici": 5, "document": [5, 6, 8, 10, 15, 20, 22, 23, 24, 25, 26, 27], "also": [5, 6, 7, 8, 10, 15], "main": [5, 22, 40], "item": 5, "avail": [5, 6, 8, 10, 13, 14, 15, 16, 29, 42], "data": [5, 7, 9, 10, 12, 13, 15, 22, 23, 24, 25, 27, 28, 29, 30, 31, 35, 36, 38, 39, 41, 42], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 20], "befor": [5, 6, 10, 22, 23, 24, 25, 26, 27, 29, 30, 36, 42], "support": [5, 6, 15, 16, 28, 42], "want": [5, 6, 10, 23, 25, 26, 27], "latest": [5, 6, 7, 23, 25, 26, 27], "releas": [5, 22, 23, 24, 25, 26, 27], "tightli": 5, "compat": [5, 15, 20, 22, 24], "matrix": [5, 16], "cento": [5, 20], "instanc": [5, 6, 10, 12, 13, 15, 26], "wget": [5, 6, 23, 25, 26, 27], "http": [5, 6, 8, 20, 22, 23, 25, 26, 27, 31, 32, 39], "com": [5, 6, 23, 25, 26, 27, 31, 32, 39], "archiv": [5, 6, 23, 25, 26, 27], "ref": 5, "tag": 5, "tar": [5, 6, 23, 25, 26, 27], "gz": [5, 6], "xvf": [5, 6], "test": [5, 20, 23, 42], "linux": 5, "amd64": 5, "copi": [5, 20, 22, 23, 24, 25, 27], "file": [5, 7, 8, 10, 12, 13, 15, 18, 22, 24, 34], "cp": [5, 23, 24, 25, 26, 27], "p": [5, 7, 8, 20, 22, 23, 25, 26, 27], "cd": [5, 6, 23, 25, 26, 27], "verifi": [5, 10, 24], "point": [5, 6, 15, 23, 25, 26, 27], "browser": [5, 6, 8, 15, 20, 23, 25, 26, 27], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 20, 26], "aggreg": [5, 12, 13], "inspir": 5, "central": [5, 9], "check": [5, 10, 13, 20, 23, 25, 26, 27, 37, 38, 42], "recomand": 5, "local": [5, 6, 7, 8, 9, 15, 20, 23, 25, 26, 27, 42], "describ": [5, 6, 8, 18, 20, 42], "respons": [5, 10], "pars": [5, 9, 15, 33, 42], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 36, 38], "load": [5, 6, 10, 12, 13, 20, 26, 28, 31, 32, 42], "multipl": [5, 6, 7, 8, 9, 10, 15, 29, 32, 33, 39, 41, 42], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 13, 20, 22, 23, 25, 27], "relat": [5, 13, 42], "modifi": [5, 14], "mkdir": 5, "templat": [5, 6, 8, 13, 20, 22, 42], "edit": [5, 6, 7, 8, 12, 13, 15, 20], "localhost": [5, 7, 26], "loki_ip": 5, "": [5, 6, 7, 9, 10, 15, 28, 29, 37, 40, 42], "49": 5, "besid": [5, 7, 22, 42], "expect": [5, 10, 23, 25, 26, 27], "scrap": [5, 7, 12, 13], "job": [5, 6, 20], "onli": [5, 6, 7, 12, 13, 20, 22, 24, 26, 31, 33, 34, 40, 42], "import": [5, 6, 7, 10, 12, 13, 22, 23, 25, 26, 27, 34], "record": [5, 7, 12, 20, 26], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 13, 15, 22, 23, 25, 26, 27], "sudo": [5, 6, 20], "promethu": [5, 12, 26], "non": [5, 20, 22, 30, 31, 35, 39, 42], "root": [5, 6, 20, 23, 25, 26, 27], "give": [5, 14, 16], "write": [5, 26, 30], "execut": [5, 7, 28, 33], "permiss": [5, 6, 22], "correct": [5, 24, 42], "static": [5, 34], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 22, 27], "host": [5, 6, 7, 9, 20, 27], "static_config": [5, 6], "127": [5, 7, 20], "right": [5, 6, 15, 42], "typic": [5, 12, 13, 15, 26, 29, 31, 40, 42], "node_export": [5, 6, 7, 9, 13, 17, 27], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 12, 13, 15, 18, 20, 22, 24, 32, 42], "everi": [5, 6, 7, 26], "scrape_timeout": 5, "timeout": [5, 41], "try": [5, 20], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 12, 13, 26], "ani": [5, 6, 10, 15, 20, 35, 42], "seri": [5, 8], "commun": [5, 19], "feder": 5, "remot": 5, "external_label": [5, 22], "scrape_config": [5, 22], "job_nam": [5, 6, 13], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": [5, 13], "target_label": 5, "9180": [5, 18, 20], "There": [5, 6, 8, 10, 14, 15, 16, 26, 39, 41, 43], "found": [5, 6, 7, 10, 15], "must": [5, 6, 12, 36], "even": [5, 6, 7, 12, 13, 20], "center": [5, 6, 8, 42], "cat": 5, "list": [5, 6], "end": [5, 6, 10, 22, 42], "66": [5, 20], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 13, 26], "dc1": [5, 6], "172": [5, 6, 20], "17": [5, 6, 17, 20, 24], "dc2": [5, 6], "previou": [5, 25, 26, 27], "deprec": 5, "5090": [5, 6, 20], "tsdb": [5, 7, 8, 26], "accumul": 5, "consol": [5, 20], "visibl": [5, 12, 13], "through": 5, "node_memory_memfre": 5, "And": [5, 15, 23, 25, 27], "scylla_reactor_util": 5, "At": [5, 15, 25, 26, 27], "emit": 5, "abl": [5, 8, 22, 24, 26], "them": [5, 7, 9, 10, 13, 15, 24, 35], "grafna": 5, "here": [5, 6, 7, 10, 22], "depend": [5, 8, 26], "repositori": [5, 6], "yum": 5, "zip": [5, 23, 25, 26, 27], "structur": 5, "dnf": 5, "access": [5, 7, 12], "r": [5, 7, 15, 20], "provis": [5, 15], "manager_3": 5, "just": [5, 15], "apivers": 5, "name": [5, 6, 8, 10, 13, 20, 24, 42], "orgid": 5, "folder": 5, "type": [5, 15, 42], "disabledelet": 5, "allowuiupd": 5, "updateintervalsecond": 5, "how": [5, 7, 8, 10, 15, 23, 25, 26, 27, 29, 30, 31, 35, 42], "often": 5, "scan": [5, 28], "chang": [5, 7, 15, 18, 20, 22, 23, 24, 25, 26, 27], "option": [5, 6, 8, 9, 12, 13, 20, 22, 26, 34], "ver_5": 5, "A": [5, 7, 8, 9, 12, 13, 15, 29, 30, 36, 40, 42], "otherwis": 5, "some": [5, 8, 10, 12, 13, 20, 26, 35, 39], "tabl": [5, 6, 10, 17, 28, 35, 42], "url": [5, 8, 22, 26], "167": 5, "proxi": [5, 12], "basicauth": 5, "camptocamp": 5, "typelogourl": 5, "public": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 35, 43], "connect": [5, 8, 15, 18, 20], "between": [5, 8, 12, 13, 20, 22, 23, 25, 26, 27, 34, 42], "strongli": [5, 42], "encourag": 5, "restrict": [5, 18], "keyspac": [5, 6], "part": [5, 6, 10, 24, 28, 31, 42], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 15, 22], "detail": [5, 10, 34, 35], "done": [5, 6, 7, 13, 15, 20, 26], "first": [5, 12, 13, 23, 25, 26, 27, 42], "new": [5, 6, 12, 13, 20, 40], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 42], "AND": 5, "login": [5, 6, 20], "proper": [5, 20], "select": [5, 35, 42], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 15, 27, 33, 34], "mention": [5, 15], "previous": [5, 25, 26, 27], "safer": [5, 42], "dedic": [5, 6], "limit": [5, 6, 8, 10, 32, 34, 42], "privileg": [5, 6, 7, 26], "un": [5, 26], "comment": 5, "relev": [5, 7, 26, 35], "usernam": 5, "unsign": 5, "ini": 5, "allow_loading_unsigned_plugin": 5, "setup": 6, "pull": [6, 20], "evalu": [6, 7, 26], "laptop": 6, "48": 6, "47": 6, "44": 6, "42": 6, "8": [6, 17, 20, 22, 26], "41": 6, "38": 6, "34": 6, "11": [6, 17], "32": 6, "29": 6, "27": [6, 15], "25": [6, 20], "18": 6, "avoid": [6, 15, 20, 32, 42], "go": [6, 12, 13, 20], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 10, 23, 25, 26, 27], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 13, 20, 22], "extract": 6, "binari": [6, 20], "clone": 6, "git": 6, "directli": [6, 9, 13], "checkout": 6, "restart": [6, 7, 8, 12, 13, 22], "know": [6, 20, 31, 42], "higher": [6, 10, 26, 31, 42], "wish": [6, 7], "match": [6, 42], "datacent": 6, "nodetool": 6, "statu": [6, 20, 26], "valid": 6, "ipv6": 6, "insid": [6, 7, 15, 20], "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 22], "listen": [6, 7, 18, 22], "set": [6, 7, 10, 15, 18, 34], "inform": [6, 7, 14, 15, 16, 18, 26, 28, 29, 30], "agent": [6, 7, 8, 9, 17, 20, 27], "machin": [6, 7, 12, 13, 20, 24], "overrid": [6, 7, 15], "n": [6, 7, 27], "my_scylla_serv": 6, "prometheus_data": 6, "mark": [6, 12, 13], "seen": 6, "genconfig": 6, "py": [6, 15], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 20, 23, 25, 26, 27], "within": [6, 10, 15], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 39], "outsid": [6, 7, 22], "result": [6, 7, 13, 22, 29, 31, 32, 34, 40, 42], "lost": [6, 7, 15, 42], "exist": [6, 10, 15, 42], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 34, 42], "firewal": [6, 20], "7000": [6, 20], "myservic": 6, "m": [6, 7, 22, 23, 25, 26, 27], "2019": [6, 17, 39], "reach": [6, 8, 12, 13, 31, 34, 36, 42], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 31, 32, 36, 38, 42], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 15, 20], "authent": [6, 7], "disabl": [6, 18, 20], "simplest": 7, "small": [7, 12, 13, 40], "util": [7, 15, 24, 26], "appropri": 7, "h": [7, 15], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 13, 26, 36, 41], "map": 7, "bind": [7, 18], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 12, 22, 26, 30, 33, 35], "addit": [7, 8, 9, 10, 14, 16, 26, 42], "specif": [7, 10, 12, 13, 18, 20, 37, 42], "driver": [7, 31, 32, 39, 42], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 20, 41], "experiment": 7, "initi": 7, "stage": 7, "process": [7, 22, 34, 41], "firstli": 7, "along": 7, "env": 7, "prerequisit": 7, "gui": [7, 15, 20], "keep": [7, 22, 26], "clear": 7, "comma": 7, "separ": [7, 10], "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 13, 15, 26], "mean": [7, 15, 22, 28, 29, 30, 31, 32, 36, 38, 42], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 15], "b": [7, 26], "o": [7, 13, 17, 24, 27, 35], "disk": [7, 10, 13, 15, 20, 28, 30, 35], "possibl": [7, 10, 18, 42], "api": [7, 8, 22], "resolv": 7, "explicitli": [7, 15], "ca": 7, "optim": [7, 33, 39, 43], "drop": [7, 41, 42], "while": [7, 10, 20, 22, 23, 25, 26, 27, 34], "cdc": 7, "request": [7, 18, 41], "someth": [7, 10, 11, 15, 26, 40], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 10, 15, 20], "horizont": 8, "scale": [8, 41], "backup": 8, "benefit": [8, 42], "flexibl": 8, "design": 8, "rest": [8, 26], "front": 8, "few": [8, 9, 23, 25, 26, 27], "reason": [8, 15, 20, 26, 38, 42], "why": 8, "million": 8, "singl": [8, 15], "capac": 8, "sometim": [8, 12, 13], "traffic": [8, 20, 39, 42], "reachabl": [8, 22], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 15, 22, 23, 25, 26, 27, 30], "expos": [8, 18, 22], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 35], "10903": 8, "10904": 8, "replica": [8, 29, 30, 31, 35, 36, 42], "abov": [8, 23, 25, 26, 27], "last": [8, 26], "db_address": 8, "could": [8, 35, 39, 41, 42], "long": [8, 10, 26, 40], "now": [8, 10, 26], "grafan": 9, "render": [9, 15], "sidecar": 9, "db": 9, "receiv": [9, 10, 42], "distribut": [9, 31, 39, 42], "email": [9, 10], "slack": [9, 10, 19], "displai": [9, 12, 13, 24], "enhanc": [10, 11], "notifi": [10, 11], "wrong": [10, 11, 15, 20, 26, 27, 40, 42], "shown": [10, 20, 23, 25, 26, 27], "condit": 10, "met": 10, "certain": 10, "defin": [10, 15, 22, 42], "what": [10, 26], "happen": [10, 20], "report": [10, 13, 17, 20, 42], "let": [10, 12, 13, 22, 27], "u": 10, "instancedown": 10, "expr": [10, 15, 26], "60": [10, 26], "error": [10, 15, 26, 35, 36, 38], "annot": 10, "descript": [10, 35], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 15, 23], "special": 10, "notif": 10, "forward": 10, "low": [10, 42], "info": 10, "warn": [10, 35], "critic": 10, "inhibit": 10, "prioriti": 10, "mute": 10, "lower": [10, 42], "space": 10, "threshold": 10, "fire": 10, "silenc": 10, "signal": 10, "action": 10, "pager": 10, "duti": 10, "extens": 10, "easier": [10, 15], "dure": [10, 13, 20, 23, 25, 26, 27], "practic": [10, 35, 39], "suitabl": 10, "rememb": 10, "overridden": [10, 15], "duplic": [10, 42], "rout": [10, 31, 42], "repres": 10, "tree": 10, "win": [10, 20], "via": [10, 20], "sluck": 10, "wors": 10, "correctli": [10, 15, 22, 24], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 24, 26], "reduc": [10, 15, 29], "simul": 10, "actual": [10, 38], "show": [10, 15, 17, 26, 42], "propag": 10, "valu": [10, 15, 33, 34, 40, 42], "similar": [10, 15], "free": 10, "big": [10, 42], "bisect": 10, "problem": [10, 35, 41, 42], "thousand": [12, 13], "ten": [12, 13], "sheer": [12, 13], "too": [12, 13, 15, 34, 40], "much": [12, 13, 34, 42], "subset": [12, 13], "move": 12, "id": [12, 15, 20], "cluster_id": 12, "token": [12, 35], "shard": [12, 13, 20, 26, 35], "dd": [12, 13], "resembl": [12, 13, 15], "filter": [12, 13, 35], "perspect": [12, 13], "graph": [12, 13, 15, 22, 24, 26, 42], "pai": [12, 13], "attent": [12, 13], "combin": [12, 13], "conflict": [12, 13], "remov": [12, 13, 22], "safest": 13, "cloud": [13, 14], "relabel": 13, "cost": [13, 42], "miss": [13, 20, 26], "origin": [13, 15, 26, 37], "export": [13, 20], "search": 13, "find": 13, "metric_relabel_config": 13, "think": 13, "issu": [13, 15, 20, 35, 39, 42], "ll": 13, "sever": [14, 16, 43], "datadog": [14, 20], "integr": [14, 19], "explain": [15, 23, 25, 26, 27, 35], "intern": [15, 31, 42], "potenti": [15, 35, 42], "whenev": 15, "save": 15, "earlier": 15, "perman": 15, "eventu": 15, "made": 15, "larg": [15, 35], "maintain": 15, "verbos": 15, "element": [15, 35], "object": 15, "attribut": 15, "aliascolor": 15, "bar": 15, "fill": [15, 41], "grid": 15, "threshold1": 15, "null": 15, "threshold1color": 15, "rgba": 15, "216": 15, "200": 15, "threshold2": 15, "threshold2color": 15, "234": 15, "112": 15, "22": 15, "gridpo": 15, "w": [15, 20], "x": [15, 20, 21], "y": [15, 21], "isnew": 15, "legend": 15, "avg": 15, "max": 15, "min": 15, "linewidth": 15, "link": [15, 35], "nullpointmod": 15, "percentag": [15, 42], "pointradiu": 15, "flot": 15, "seriesoverrid": 15, "span": 15, "steppedlin": 15, "sum": [15, 26], "node_filesystem_avail": 15, "intervalfactor": 15, "legendformat": 15, "refid": 15, "timefrom": 15, "timeshift": 15, "titl": 15, "size": [15, 32, 42], "tooltip": 15, "msresolut": 15, "share": [15, 27, 34], "sort": [15, 42], "value_typ": 15, "cumul": 15, "transpar": 15, "xaxi": 15, "yax": 15, "percent": 15, "logbas": 15, "101": 15, "short": 15, "imagin": 15, "redund": 15, "css": 15, "hierarch": 15, "definit": [15, 22, 42], "inherit": 15, "row": [15, 42], "base_row": 15, "collaps": 15, "height": 15, "250px": 15, "Will": 15, "150px": 15, "output": 15, "consid": 15, "bytes_panel": 15, "byte": 15, "unit": 15, "axi": 15, "adjust": 15, "readabl": 15, "gb": 15, "mb": 15, "grasp": 15, "12": [15, 20, 26], "wa": [15, 42], "break": [15, 32, 42], "later": 15, "were": [15, 22, 42], "absolut": 15, "posit": 15, "width": 15, "backward": [15, 20, 22, 24], "ve": 15, "had": 15, "imposs": 15, "hand": 15, "overcom": 15, "transit": [15, 20, 24, 26], "calcul": [15, 20, 26], "taken": [15, 22], "still": [15, 26], "unlik": 15, "partial": 15, "24": [15, 26], "don": [15, 26], "python": 15, "pyyaml": 15, "make_dashboard": 15, "revers": 15, "usual": [15, 20, 35, 42], "wrapper": 15, "re": [15, 31], "refresh": 15, "generate_gener": 15, "ran": 15, "mayb": 15, "interfac": [16, 20], "2022": 17, "2023": 17, "2024": 17, "2021": 17, "2018": [17, 32], "14": [17, 20], "onlin": 18, "prometheus_port": 18, "prometheus_address": 18, "ask": 19, "question": 19, "discuss": 19, "forum": 19, "channel": 19, "56090": 20, "old": [20, 23, 24, 25, 26, 27], "howev": 20, "twice": 20, "easiest": 20, "scylla_manager1": 20, "messag": 20, "wait": [20, 36], "post": 20, "past": [20, 24], "mai": [20, 34, 36, 42], "ownership": 20, "la": 20, "grep": 20, "drwxr": 20, "xr": 20, "4096": 20, "jun": 20, "chown": 20, "appear": 20, "unreach": [20, 36], "immedi": 20, "suspect": 20, "tab": 20, "rang": [20, 26, 42], "align": 20, "On": 20, "41bd3db26240": 20, "entrypoin": 20, "ago": [20, 26], "23": 20, "7001": 20, "tcp": 20, "9042": 20, "9160": 20, "10000": 20, "click": 20, "usag": [20, 31, 42], "fetch": 20, "curl": 20, "scylla_nod": 20, "return": [20, 22, 28, 29, 30, 32, 36, 38, 42], "ef": 20, "gre": 20, "scylla_setup": 20, "9100": 20, "fallback": 20, "mechan": [20, 26, 29], "present": [20, 26], "newer": [20, 25, 26, 27], "reli": [20, 26, 42], "clean": 20, "recommend": [20, 23, 25, 26, 27, 42], "increas": [20, 32, 34, 42], "might": [20, 40], "overload": 20, "sysconfig": 20, "collector": 20, "captur": 20, "tshark": 20, "f": 20, "dst": 20, "eth0": 20, "toward": 20, "199": 20, "203": 20, "229": 20, "89": 20, "142": 20, "59212": 20, "ack": 20, "seq": 20, "317": 20, "78193": 20, "158080": 20, "len": 20, "tsval": 20, "79869679": 20, "tsecr": 20, "3347447210": 20, "74": 20, "60440": 20, "syn": 20, "29200": 20, "mss": 20, "1460": 20, "sack_perm": 20, "79988291": 20, "128": 20, "sinc": 22, "parallel": [22, 23, 25, 26, 27], "migrat": [22, 23, 25, 27], "lose": 22, "histor": [22, 26], "safe": 22, "page": [22, 24, 35], "unzip": [22, 23, 24, 25, 26, 27], "3001": [22, 23, 25, 26, 27], "9091": [22, 23, 25, 26, 27], "9094": 22, "fail": [22, 29, 31, 35, 42], "loss": 22, "everyth": 22, "stop": [22, 23, 24, 25, 26, 27], "format": [22, 26], "rule_fil": 22, "9111": 22, "phase": [22, 24], "serv": 22, "remote_read": 22, "v1": 22, "histori": [22, 24], "continu": [22, 23, 25, 26, 27], "back": [22, 29], "uninstal": [23, 25, 26, 27], "minor": [23, 25, 26, 27], "9095": [23, 25, 26, 27], "brows": [23, 25, 26, 27], "satisfi": [23, 25, 26, 27], "shut": [23, 25, 26, 27], "caus": [23, 25, 26, 27, 31, 42], "blackout": [23, 25, 26, 27], "normal": [23, 25, 26, 27], "oper": [23, 25, 26, 27, 35, 42], "complet": [23, 25, 26, 27], "switch": [24, 26], "fulli": 24, "affect": 24, "older": [24, 25, 26, 27], "helper": 24, "node_exporter_instal": 24, "ship": 24, "sub": 24, "color": 24, "simpli": 24, "side": [25, 26, 27, 28, 35, 42], "ensur": 26, "patch": 26, "skip": 26, "entir": 26, "p99": 26, "latenc": [26, 31, 34, 42], "wlatencyp99": 26, "histogram_quantil": 26, "99": 26, "rate": [26, 42], "scylla_storage_proxy_coordinator_write_latency_bucket": 26, "scheduling_group_nam": 26, "le": 26, "fall": [26, 29], "year": 26, "month": 26, "360": 26, "our": 26, "nine": 26, "gap": 26, "minu": 26, "exact": 26, "goe": 26, "revert": 26, "stat": 26, "overlap": 26, "promtool": 26, "90": 26, "epoc": 26, "translat": 26, "mani": [26, 29, 30, 42], "echo": 26, "date": 26, "3600": 26, "exec": 26, "back_fil": 26, "took": 26, "hour": 26, "creation": 26, "inerupt": 26, "split": 26, "smaller": 26, "successfulli": 26, "compact": [26, 41], "half": 26, "itself": 27, "almost": 27, "alwai": [27, 33], "sylladb": 27, "prevent": [27, 42], "primari": [28, 42], "kei": [28, 42], "These": [28, 42], "kind": [28, 42], "bigger": 28, "care": [28, 29, 30, 42], "replicationfactor": [29, 30], "piec": 29, "determin": [29, 30, 36, 42], "repli": [29, 30, 32, 36, 38, 42], "unavail": [29, 42], "client": [29, 32, 35, 42], "respond": 29, "accompani": 29, "deep": 29, "understand": 29, "acknowledg": 30, "coordin": [30, 31, 36, 38, 42], "hint": 30, "fact": 30, "yet": 30, "ideal": [31, 42], "resourc": [31, 42], "replic": [31, 36, 38, 42], "prepar": [31, 35, 39], "statement": [31, 33, 35, 39], "balanc": [31, 34, 35, 42], "polici": 31, "cours": 31, "intro": 31, "recap": 31, "ring": [31, 42], "architectur": 31, "chunk": [32, 42], "overal": [32, 34, 42], "thu": 32, "www": [32, 39], "07": 32, "13": 32, "effici": [32, 42], "concret": 33, "thumb": 33, "favor": 33, "background": [34, 41], "impact": [34, 35], "compaction_static_shar": 34, "50": 34, "indic": [34, 35, 40, 41, 42], "overli": 34, "slow": 34, "enforc": 34, "min_threshold": 34, "compaction_enforce_min_threshold": 34, "bucket": 34, "sstabl": 34, "stc": 34, "recogn": 35, "bad": 35, "solv": 35, "categori": [35, 42], "jump": 35, "cell": 35, "model": [35, 39, 41, 42], "code": 35, "awar": 35, "due": 35, "unsatisfi": 35, "faulti": 35, "cach": 35, "evict": 35, "answer": [36, 38], "aka": 36, "factor": 36, "quorum": [36, 42], "hardwar": [37, 41], "occur": 37, "leav": 38, "risk": 38, "identifi": [38, 42], "evenli": 39, "across": 39, "becom": 39, "bottleneck": 39, "explan": 39, "08": 39, "field": 40, "being": 40, "defi": 40, "purpos": 40, "shed": 41, "repair": 41, "queue": 41, "upper": 42, "gaug": 42, "inspect": 42, "zero": 42, "mislead": 42, "panel": 42, "holder": 42, "inject": 42, "did": 42, "compound": 42, "column": 42, "order": 42, "BY": 42, "ks1": 42, "table_demo": 42, "text": 42, "int": 42, "desc": 42, "cat1": 42, "asc": 42, "overhead": 42, "thing": 42, "major": 42, "success": 42, "hurt": 42, "cl": 42, "expens": 42, "term": 42, "ONE": 42, "local_quorum": 42, "local_on": 42, "nearest": 42, "advisor": 43}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 12, 14, 27], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 35, 43], "stack": [1, 3, 5, 6, 8, 9, 11, 14, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 35, 43], "us": [2, 5, 6, 8, 12, 13, 15, 28, 29, 30, 43], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 15], "set": [2, 5, 22, 23, 25, 26, 27], "prometheu": [2, 4, 5, 6, 7, 8, 10, 18, 22], "grafana": [2, 5, 6, 7, 15, 20], "provis": 2, "data": [2, 6, 8, 20, 26], "sourc": [2, 8, 20], "file": [2, 6, 20, 23, 25, 26, 27], "dashboard": [2, 6, 12, 13, 15], "load": 2, "start": [2, 6, 7, 20, 26], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 13, 22, 23, 24, 25, 26, 27], "scylla": [3, 5, 6, 8, 11, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30, 35, 43], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 15, 22, 41], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 37], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 34], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 20], "configur": [5, 6, 8, 12, 13], "enabl": 5, "compat": 6, "matrix": [6, 17], "post": [6, 12, 13, 26, 32, 39], "node": [6, 37], "from": [6, 15, 20], "manag": [6, 7, 11, 20], "consul": 6, "api": [6, 18], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 20], "add": [6, 13], "addit": 6, "target": 6, "specif": 6, "version": [6, 22, 23, 24, 25, 26, 27], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 15, 23, 25, 26, 27, 35, 42], "all": [7, 23, 25, 26, 27, 29], "sh": [7, 15], "command": 7, "gener": [7, 15], "option": 7, "relat": [7, 22, 23, 24, 25, 26, 27], "ldap": 7, "support": [7, 17], "retent": 7, "period": [7, 26], "alert": [7, 10, 11, 22], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 28, 29, 30, 31, 32, 33, 39, 42], "updat": 8, "high": 9, "level": [9, 20, 29, 30, 36, 42], "architectur": 9, "sever": 10, "ad": [10, 12, 13, 15], "modifi": [10, 15], "tip": 10, "when": 10, "cloud": 12, "datadog": [12, 13], "integr": [12, 13], "overview": [12, 13], "And": [12, 13, 20], "agent": [12, 13], "upload": [12, 13], "record": 13, "rule": [13, 22], "more": 13, "metric": [13, 20, 26], "procedur": [14, 22, 23, 24, 25, 26, 27], "limit": 15, "consist": [15, 29, 30, 36, 42], "between": 15, "restart": [15, 26], "upgrad": [15, 20, 21, 22, 23, 24, 25, 26, 27], "templat": 15, "class": 15, "panel": 15, "exampl": 15, "format": 15, "layout": 15, "valid": [15, 22, 23, 24, 25, 26, 27], "refer": 16, "guid": [16, 19, 22, 23, 24, 25, 26, 27], "interfac": 18, "troubleshoot": [19, 20], "problem": 20, "2": [20, 22, 23, 24], "duplic": 20, "inform": 20, "A": 20, "contain": [20, 23, 25, 26, 27], "fail": [20, 36, 38], "To": 20, "permiss": 20, "No": 20, "point": 20, "solut": 20, "chart": 20, "show": 20, "error": [20, 37], "sign": 20, "server": [20, 23, 25, 26, 27], "notic": 20, "open": 20, "3": [20, 22, 24, 25, 26], "0": 20, "enterpris": 20, "2019": 20, "1": [20, 22, 24], "latenc": 20, "graph": 20, "ar": [20, 31, 32, 33, 39], "empti": 20, "reduc": 20, "total": 20, "number": [20, 27], "remov": 20, "interrupt": 20, "node_export": [20, 24], "work": 20, "wireshark": 20, "x": [22, 23, 24, 25, 26, 27], "latest": 22, "new": [22, 23, 24, 25, 26, 27], "4": [22, 26, 27], "move": [22, 23, 25, 26, 27], "old": 22, "b": [22, 27], "rollback": [22, 23, 24, 25, 26, 27], "link": [22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 39], "y": [23, 25, 26, 27], "": [23, 25, 26, 27], "i": [23, 25, 26, 27, 37], "run": [23, 25, 26, 27], "correct": [23, 25, 26, 27], "correctli": [23, 25, 27], "kill": [23, 25, 26, 27], "test": [25, 26, 27], "mode": [25, 26, 27], "second": 26, "migrat": 26, "backup": 26, "back": 26, "fill": 26, "determin": 26, "backfil": 26, "time": 26, "end": 26, "process": 26, "creat": 26, "copi": 26, "port": 27, "some": [28, 29, 30, 31, 32, 33, 36, 38], "allow": [28, 42], "filter": [28, 42], "univers": [29, 30, 31], "ani": 30, "token": [31, 42], "awar": [31, 42], "select": 32, "non": [32, 33], "page": [32, 42], "blog": [32, 39], "prepar": [33, 40, 42], "compact": 34, "take": 34, "lot": 34, "cpu": 34, "advisor": 35, "section": 35, "oper": [36, 38], "due": 36, "unsatisfi": 36, "o": 37, "can": 37, "indic": 37, "faulti": 37, "replica": 38, "side": 38, "cql": [39, 42], "balanc": 39, "among": 39, "shard": 39, "statement": [40, 42], "cach": 40, "evict": 40, "overload": 41, "optim": 42, "revers": 42, "read": 42, "cross": 42, "dc": 42, "request": 42}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some operations failed on the replica side": [[38, "some-operations-failed-on-the-replica-side"]], "Compaction takes lots of memory and CPU": [[34, "compaction-takes-lots-of-memory-and-cpu"]], "I/O Errors can indicate a node with a faulty disk": [[37, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some SELECT queries are non-paged": [[32, "some-select-queries-are-non-paged"]], "Blog-post Links": [[32, "blog-post-links"]], "Some queries are not token-aware": [[31, "some-queries-are-not-token-aware"]], "University link": [[31, "university-link"]], "Some queries use Consistency Level: ANY": [[30, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[30, "link-to-scylla-university"], [29, "link-to-scylla-university"]], "Some queries are non-prepared": [[33, "some-queries-are-non-prepared"]], "Scylla Monitoring Stack Advisor": [[35, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[35, "the-advisor-section"]], "Some operation failed due to unsatisfied consistency level": [[36, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "CQL queries are not balanced among shards": [[39, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[39, "blog-post-link"]], "Scylla Monitoring Datadog Integration": [[13, "scylla-monitoring-datadog-integration"]], "Scylla Monitoring Datadog Integration Overview": [[13, "scylla-monitoring-datadog-integration-overview"]], "Install And configure the Datadog Agent": [[13, "install-and-configure-the-datadog-agent"], [12, "install-and-configure-the-datadog-agent"]], "Post configuration": [[13, "post-configuration"], [12, "post-configuration"]], "Add datadog recording rules": [[13, "add-datadog-recording-rules"]], "Upload the Dashboard": [[13, "upload-the-dashboard"], [12, "upload-the-dashboard"]], "Using the Dashboard": [[13, "using-the-dashboard"], [12, "using-the-dashboard"]], "Adding Monitor": [[13, "adding-monitor"], [12, "adding-monitor"]], "Adding more metrics to Datadog": [[13, "adding-more-metrics-to-datadog"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alerts severity": [[10, "alerts-severity"]], "Adding Alerts": [[10, "adding-alerts"]], "Modifying Alerts": [[10, "modifying-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[19, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "ScyllaDB Cloud Monitoring Datadog Integration": [[12, "scylladb-cloud-monitoring-datadog-integration"]], "ScyllaDB Monitoring Datadog Integration Overview": [[12, "scylladb-monitoring-datadog-integration-overview"]], "Scylla Monitoring Stack Reference Guide": [[16, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Support Matrix": [[17, "scylla-monitoring-stack-support-matrix"]], "Adding and Modifying Dashboards": [[15, "adding-and-modifying-dashboards"]], "General Limitations": [[15, "general-limitations"]], "Consistency Between Restarts": [[15, "consistency-between-restarts"]], "Consistency Between Upgrades": [[15, "consistency-between-upgrades"]], "Using Templated Dashboards": [[15, "using-templated-dashboards"]], "The Template Class System": [[15, "the-template-class-system"]], "Panel Example": [[15, "panel-example"]], "Grafana Formats and Layouts": [[15, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[15, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[15, "prerequisite"], [2, "prerequisite"]], "Validation": [[15, "validation"], [22, "validation"]], "ScyllaDB Monitoring Stack Procedures": [[14, "scylladb-monitoring-stack-procedures"]], "Scylla Monitoring Stack Interfaces": [[18, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[18, "prometheus-api"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "ScyllaDB Monitoring Stack": [[9, "scylladb-monitoring-stack"], [1, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b": [[27, "upgrade-guide-scylladb-monitoring-4-x-a-to-scylladb-monitoring-4-y-b"]], "Upgrade Procedure": [[27, "upgrade-procedure"], [22, "upgrade-procedure"], [25, "upgrade-procedure"], [24, "upgrade-procedure"], [23, "upgrade-procedure"], [26, "upgrade-procedure"]], "Install 4.y.b (The new version)": [[27, "install-4-y-b-the-new-version"]], "Setting the server\u2019s files": [[27, "setting-the-server-s-files"], [25, "setting-the-server-s-files"], [23, "setting-the-server-s-files"], [26, "setting-the-server-s-files"]], "Validate the port numbers": [[27, "validate-the-port-numbers"]], "Validate the new version is running the correct version": [[27, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"], [23, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[27, "validate-the-version-installed-correctly"], [25, "validate-the-version-installed-correctly"], [23, "validate-the-version-installed-correctly"]], "Killing the new 4.y.b Monitoring stack in testing mode": [[27, "killing-the-new-4-y-b-monitoring-stack-in-testing-mode"]], "Move to version 4.y.b (the new version)": [[27, "move-to-version-4-y-b-the-new-version"]], "Kill all containers": [[27, "kill-all-containers"], [25, "kill-all-containers"], [23, "kill-all-containers"], [26, "kill-all-containers"]], "Rollback to version 4.x.a": [[27, "rollback-to-version-4-x-a"]], "Related Links": [[27, "related-links"], [22, "related-links"], [25, "related-links"], [24, "related-links"], [23, "related-links"], [26, "related-links"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[22, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[22, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[22, "install-the-new-monitoring-stack"], [24, "install-the-new-monitoring-stack"]], "3. Alerting Rules": [[22, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[22, "moving-to-prometheus-2-x"]], "a. Set the old system": [[22, "a-set-the-old-system"]], "b. Set the new system": [[22, "b-set-the-new-system"]], "Validate the upgrade": [[22, "validate-the-upgrade"], [24, "validate-the-upgrade"]], "Rollback": [[22, "rollback"], [24, "rollback"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[25, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[25, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[25, "move-to-version-3-y-the-new-version"]], "Rollback to version 3.x": [[25, "rollback-to-version-3-x"], [26, "rollback-to-version-3-x"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[24, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[24, "validate-node-exporter-version"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[23, "install-2-y-the-new-version"]], "Move to version 2.y (the new version)": [[23, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[23, "rollback-to-version-2-x"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[26, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[26, "install-4-y-the-new-version"]], "Running in test mode": [[26, "running-in-test-mode"]], "Running second monitoring stack": [[26, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[26, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[26, "migrating"]], "Move to version 4.y (the new version)": [[26, "move-to-version-4-y-the-new-version"]], "Backup": [[26, "backup"]], "Post-installation: Metrics back-filling": [[26, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[26, "determine-the-backfilling-period"]], "Determine the start time": [[26, "determine-the-start-time"]], "Determine the end time": [[26, "determine-the-end-time"]], "Backfilling Process": [[26, "backfilling-process"]], "backup": [[26, "id1"]], "Restart the monitoring stack": [[26, "restart-the-monitoring-stack"]], "Create the data files": [[26, "create-the-data-files"]], "Copy the data files": [[26, "copy-the-data-files"]], "Some queries use ALLOW FILTERING": [[28, "some-queries-use-allow-filtering"]], "Troubleshoot Scylla Monitoring Stack": [[20, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[20, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[20, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[20, "a-container-fails-to-start"]], "Files And Directory Permissions": [[20, "files-and-directory-permissions"]], "No Data Points": [[20, "no-data-points"]], "Solution": [[20, "solution"], [20, "id1"], [20, "id2"], [20, "id3"]], "Grafana Chart Shows Error (!) Sign": [[20, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[20, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[20, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[20, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[20, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[20, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[20, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[20, "working-with-wireshark"]], "Upgrade Scylla Monitoring Stack": [[21, "upgrade-scylla-monitoring-stack"]], "Some queries use Consistency Level: ALL": [[29, "some-queries-use-consistency-level-all"]], "System Overload": [[41, "system-overload"]], "Using Scylla Monitoring Stack": [[43, "using-scylla-monitoring-stack"]], "Prepared statements cache eviction": [[40, "prepared-statements-cache-eviction"]], "The CQL Optimization": [[42, "the-cql-optimization"]], "Prepared Statements": [[42, "prepared-statements"]], "Token Aware": [[42, "token-aware"]], "Paged Queries": [[42, "paged-queries"]], "Reversed CQL Reads": [[42, "reversed-cql-reads"]], "ALLOW FILTERING": [[42, "allow-filtering"]], "Consistency Level": [[42, "consistency-level"]], "Cross DC": [[42, "cross-dc"]], "Cross DC Consistency Level": [[42, "cross-dc-consistency-level"]], "Cross DC read requests": [[42, "cross-dc-read-requests"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/stable/sitemap.xml b/stable/sitemap.xml new file mode 100644 index 000000000..041ad8404 --- /dev/null +++ b/stable/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/cloud-integration.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/stable/troubleshooting/index.html b/stable/troubleshooting/index.html new file mode 100644 index 000000000..486ea8e5e --- /dev/null +++ b/stable/troubleshooting/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Troubleshooting Guide for Scylla Monitoring Stack

                                      +
                                      +
                                      +

                                      Choose a topic to begin:

                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/troubleshooting/monitor-troubleshoot.html b/stable/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..083238aa2 --- /dev/null +++ b/stable/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,892 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Troubleshoot Scylla Monitoring Stack

                                      +

                                      This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                                      +
                                      +

                                      Problem

                                      +
                                      +

                                      Scylla-Manager 2.2 with Duplicate information

                                      +

                                      Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                                      +
                                        +
                                      • For Manager server: from 56090 to 5090

                                      • +
                                      • For Manager Agent: from 56090 to 5090

                                      • +
                                      +

                                      For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                                      +

                                      However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                                      +

                                      The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                                      +

                                      Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                                      +
                                      +
                                      +

                                      A Container Fails To Start

                                      +

                                      When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                                      +
                                      Wait for Prometheus container to start........Error: Prometheus container failed to start
                                      +
                                      +
                                      +

                                      Should this happen, check the Docker logs for more information.

                                      +
                                      docker logs aprom
                                      +
                                      +
                                      +

                                      Usually the reason for the failure is described in the logs.

                                      +
                                      +
                                      +

                                      Files And Directory Permissions

                                      +
                                      +

                                      Note

                                      +

                                      Avoid running Docker containers as root.

                                      +
                                      +

                                      The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                                      +

                                      If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                                      +
                                      +

                                      Note

                                      +

                                      If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                                      +
                                      +

                                      For example if your Prometheus data directory is /prom-data and you are using centos user

                                      +
                                      ls -la /|grep prom-data
                                      +
                                      +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                                      +
                                      +sudo chown -R centos:centos /prom-data
                                      +
                                      +ls -la /|grep prom-data
                                      +
                                      +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                                      +
                                      +
                                      +
                                      +
                                      +

                                      No Data Points

                                      +

                                      No data points on all data charts.

                                      +
                                      +

                                      Solution

                                      +

                                      If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                                      +
                                        +
                                      1. Login to the Prometheus console:

                                      2. +
                                      3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                                      4. +
                                      5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                                      6. +
                                      +
                                      +
                                        +
                                      • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                                      • +
                                      • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                                      • +
                                      • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                                      • +
                                      +
                                      +

                                      For example:

                                      +
                                      ./start-all.sh -v 3.1
                                      +
                                      +
                                      +

                                      More on start-all.sh options.

                                      +
                                      +
                                      +
                                      +

                                      Grafana Chart Shows Error (!) Sign

                                      +

                                      Run this procedure on the Scylla Monitoring Stack server.

                                      +

                                      If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                                      +
                                      +

                                      Solution

                                      +

                                      On the Scylla Monitoring Stack server:

                                      +
                                        +
                                      1. Check Prometheus is running using docker ps.

                                      2. +
                                      +
                                        +
                                      • If it is not running check the prometheus.yml for errors.

                                      • +
                                      +

                                      For example:

                                      +
                                      CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                                      +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                                      +
                                      +
                                      +
                                        +
                                      • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                                      • +
                                      +
                                      +
                                      +
                                      +

                                      Grafana Shows Server Level Metrics, but not Scylla Metrics

                                      +

                                      Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                                      +
                                      +

                                      Solution

                                      +
                                        +
                                      • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                                      • +
                                      +

                                      For example

                                      +
                                      curl 172.17.0.2:9180/metrics
                                      +
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Grafana Shows Scylla Metrics, but not Server Level Metrics

                                      +

                                      Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                                      +
                                      +

                                      Solution

                                      +

                                      1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                                      +
                                        +
                                      1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                                      2. +
                                      +
                                      +
                                      +

                                      Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                                      +

                                      While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                                      +

                                      If the node_exporter service is not starting it may need to be updated manually.

                                      +

                                      Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                                      +
                                      +
                                      +
                                      +

                                      Latencies Graphs Are empty

                                      +

                                      Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                                      +

                                      During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                                      +

                                      Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                                      +

                                      If only the latency graphs are missing, it is because of missing recording rules.

                                      +

                                      This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                                      +

                                      If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                                      +
                                      +
                                      +

                                      Reducing the total number of metrics

                                      +

                                      In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                                      +
                                      +

                                      Remove interrupts from node_exporter

                                      +

                                      By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                                      +
                                      +
                                      +
                                      +

                                      Working with Wireshark

                                      +

                                      No metrics shown in the Scylla Monitoring Stack.

                                      +
                                        +
                                      1. Install wireshark

                                      2. +
                                      +

                                      2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                                      +

                                      For example:

                                      +
                                      tshark -i eth0 -f "dst port 9180"
                                      +
                                      +
                                      +

                                      Capture from Scylla node towards Scylla Monitoring Stack server.

                                      +

                                      In this example, Scylla is running.

                                      +
                                      Monitor ip        Scylla node ip
                                      +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                                      +
                                      +
                                      +

                                      In this example, Scylla is not running

                                      +
                                      Monitor ip        Scylla node ip
                                      +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                                      +
                                      +
                                      +
                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/troubleshooting/monitor_troubleshoot.html b/stable/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..193a16915 --- /dev/null +++ b/stable/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/index.html b/stable/upgrade/index.html new file mode 100644 index 000000000..662c3f49d --- /dev/null +++ b/stable/upgrade/index.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Upgrade Scylla Monitoring Stack

                                      +
                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..2d72d47c7 --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,800 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                                      +

                                      This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                                      +

                                      Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                                      +
                                      +

                                      Upgrade Procedure

                                      +
                                      +

                                      1. Upgrade to the latest 1.x version

                                      +

                                      Before starting the upgrade procedure, make sure you are running the latest 1.x version

                                      +
                                      +
                                      +

                                      2. Install the new monitoring stack

                                      +
                                        +
                                      1. Download the 2.x version from the release page.

                                      2. +
                                      3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                                      4. +
                                      5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                                        +
                                          +
                                        • scylla_servers.yml

                                        • +
                                        • scylla_manager_servers.yml

                                        • +
                                        • node_exporter_servers.yml

                                        • +
                                        +
                                      6. +
                                      7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                                      8. +
                                      +
                                      ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                                      +
                                      +
                                      +
                                      +

                                      Note

                                      +

                                      Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                                      +
                                      +

                                      While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                                      +
                                      ./kill-all.sh -g 3001 -p 9091 -m 9094
                                      +
                                      +
                                      +
                                      +

                                      Validation

                                      +

                                      Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                                      +
                                      +
                                      +
                                      +

                                      3. Alerting Rules

                                      +

                                      Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                                      +
                                      +
                                      +

                                      4. Moving to Prometheus 2.x

                                      +

                                      Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                                      +

                                      Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                                      +
                                      +

                                      a. Set the old system

                                      +

                                      The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                                      +
                                        +
                                      • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                                      • +
                                      • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                                      • +
                                      +
                                      +

                                      Note

                                      +

                                      After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                                      +
                                      +
                                      +
                                      +

                                      b. Set the new system

                                      +

                                      The following step will allow the new monitoring system to read historical metrics from the old system.

                                      +
                                        +
                                      • In the Prometheus prometheus.yml.template file add the following at the end:

                                      • +
                                      +
                                      remote_read:
                                      +  - url: "http://{ip}:9111/api/v1/read"
                                      +
                                      +
                                      +

                                      Where {ip} is the ip of the old system.

                                      +
                                        +
                                      • restart the new stack

                                      • +
                                      +
                                      +
                                      +
                                      +

                                      Validate the upgrade

                                      +

                                      You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                                      +
                                      +
                                      +
                                      +

                                      Rollback

                                      +

                                      In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                                      +
                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..15d8c249f --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                                      +

                                      This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                                      +
                                      +

                                      Upgrade Procedure

                                      +

                                      We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                      +

                                      Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                      +
                                      +

                                      Install 2.y (The new version)

                                      +
                                      wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                                      +unzip scylla-monitoring-2.y.zip
                                      +cd scylla-monitoring-scylla-monitoring-2.y/
                                      +
                                      +
                                      +

                                      Replace “y” with the new minor release number, for example, 2.1.zip

                                      +
                                      +
                                      +

                                      Setting the server’s files

                                      +

                                      Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                                      +
                                      cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                                      +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Validate the new version is running the correct version

                                      +

                                      Starting from Scylla-Monitoring version 2.2, you can run:

                                      +
                                      ./start-all.sh --version
                                      +
                                      +
                                      +

                                      To validate the Scylla-Monitoring version.

                                      +
                                      +
                                      +

                                      Validate the version installed correctly

                                      +

                                      To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                                      +
                                      ./start-all.sh -p 9091 -g 3001 -m 9095
                                      +
                                      +
                                      +

                                      Browse to http://{ip}:9091 +And check the Grafana dashboard

                                      +

                                      Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                                      +
                                      +

                                      Caution

                                      +

                                      Important: do not use the local dir flag when testing!

                                      +
                                      +

                                      When you are satisfied with the data in the dashboard, you can shut down the containers.

                                      +
                                      +

                                      Caution

                                      +

                                      Important: Do not kill the 2.x version that is currently running.

                                      +
                                      +

                                      Use the following command to kill the containers:

                                      +
                                      ./kill-all.sh -p 9091 -g 3001 -m 9095
                                      +
                                      +
                                      +

                                      You can start and stop the new 2.y version while testing.

                                      +
                                      +
                                      +

                                      Move to version 2.y (the new version)

                                      +

                                      Note: migrating will cause a few seconds of blackout in the system.

                                      +

                                      We assume that you are using external volume to store the metrics data.

                                      +
                                      +

                                      Kill all containers

                                      +

                                      Follow the instruction on how to kill the 2.y version when in testing mode.

                                      +

                                      To kill the 2.x version containers, run:

                                      +
                                      ./kill-all.sh
                                      +
                                      +
                                      +

                                      Start version 2.y in normal mode

                                      +

                                      From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                                      +
                                      ./start-all.sh -d /path/to/data/dir
                                      +
                                      +
                                      +

                                      Point your browser to http://{ip}:3000 and see that the data is there.

                                      +
                                      +
                                      +
                                      +

                                      Rollback to version 2.x

                                      +

                                      To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                                      +

                                      To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                                      +
                                      ./kill-all.sh
                                      +cd /path/to/scylla-grafana-2.x/
                                      +./start-all.sh -d /path/to/data/dir
                                      +
                                      +
                                      +
                                      +
                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..2e5e77a32 --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,758 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                                      +

                                      This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                                      +

                                      Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                                      +
                                      +

                                      Upgrade Procedure

                                      +
                                      +

                                      1. Validate node_exporter version

                                      +

                                      Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                                      +

                                      If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                                      +
                                      +
                                      +

                                      2. Install the new monitoring stack

                                      +
                                        +
                                      1. Download the 3.x version from the release page.

                                      2. +
                                      3. Unzip it into a different directory.

                                      4. +
                                      5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                                        +
                                          +
                                        • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                                        • +
                                        • scylla_manager_servers.yml

                                        • +
                                        +
                                        +
                                        +

                                        Note

                                        +

                                        The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                                        +
                                        +
                                        +
                                      6. +
                                      7. Stop the old monitoring stack

                                        +
                                        +
                                        ./kill-all.sh
                                        +
                                        +
                                        +
                                        +
                                      8. +
                                      9. Start the new monitoring stack

                                        +
                                        +
                                        ./start-all.sh -d /prometheus-data-path
                                        +
                                        +
                                        +
                                        +
                                      10. +
                                      +
                                      +
                                      +

                                      Validate the upgrade

                                      +

                                      You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                                      +

                                      Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                                      +
                                      +
                                      +
                                      +

                                      Rollback

                                      +

                                      To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                                      +
                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..6cd07ac3a --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,802 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                                      +

                                      This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                                      +
                                      +

                                      Upgrade Procedure

                                      +

                                      We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                      +

                                      Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                      +
                                      +

                                      Install 3.y (The new version)

                                      +
                                      wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                                      +unzip scylla-monitoring-3.y.zip
                                      +cd scylla-monitoring-scylla-monitoring-3.y/
                                      +
                                      +
                                      +

                                      Replace “y” with the new minor release number, for example, 3.0.1.zip

                                      +
                                      +
                                      +

                                      Setting the server’s files

                                      +

                                      Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                      +
                                      cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                      +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Validate the new version is running the correct version

                                      +

                                      Starting from Scylla-Monitoring version 2.2, you can run:

                                      +
                                      ./start-all.sh --version
                                      +
                                      +
                                      +

                                      To validate the Scylla-Monitoring version.

                                      +
                                      +
                                      +

                                      Validate the version installed correctly

                                      +

                                      To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                                      +
                                      ./start-all.sh -p 9091 -g 3001 -m 9095
                                      +
                                      +
                                      +

                                      Browse to http://{ip}:9091 +And check the Grafana dashboard

                                      +

                                      Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                      +
                                      +

                                      Caution

                                      +

                                      Important: do not use the local dir flag when testing!

                                      +
                                      +

                                      When you are satisfied with the data in the dashboard, you can shut down the containers.

                                      +
                                      +

                                      Caution

                                      +

                                      Important: Do not kill the 3.x version that is currently running.

                                      +
                                      +
                                      +
                                      +

                                      Killing the new 3.y Monitoring stack in testing mode

                                      +

                                      Use the following command to kill the containers:

                                      +
                                      ./kill-all.sh -p 9091 -g 3001 -m 9095
                                      +
                                      +
                                      +

                                      You can start and stop the new 3.y version while testing.

                                      +
                                      +
                                      +

                                      Move to version 3.y (the new version)

                                      +

                                      Note: migrating will cause a few seconds of blackout in the system.

                                      +

                                      We assume that you are using external volume to store the metrics data.

                                      +
                                      +

                                      Kill all containers

                                      +

                                      At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                      +

                                      Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                                      +

                                      kill the older 3.x version containers by running:

                                      +
                                      ./kill-all.sh
                                      +
                                      +
                                      +

                                      Start version 3.y in normal mode

                                      +

                                      From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                                      +
                                      ./start-all.sh -d /path/to/data/dir
                                      +
                                      +
                                      +

                                      Point your browser to http://{ip}:3000 and see that the data is there.

                                      +
                                      +
                                      +
                                      +

                                      Rollback to version 3.x

                                      +

                                      To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                      +

                                      To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                                      +
                                      ./kill-all.sh
                                      +cd /path/to/scylla-grafana-3.x/
                                      +./start-all.sh -d /path/to/data/dir
                                      +
                                      +
                                      +
                                      +
                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..864386c10 --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,945 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                                      +

                                      This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                                      +
                                      +

                                      Upgrade Procedure

                                      +

                                      We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                                      +

                                      Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                                      +
                                      +

                                      Install 4.y (The new version)

                                      +
                                      wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                                      +unzip scylla-monitoring-4.y.zip
                                      +cd scylla-monitoring-scylla-monitoring-4.y/
                                      +
                                      +
                                      +

                                      Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                                      +
                                      +
                                      +

                                      Setting the server’s files

                                      +

                                      Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                      +
                                      cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                      +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Validate the new version is running the correct version

                                      +

                                      run:

                                      +
                                      ./start-all.sh --version
                                      +
                                      +
                                      +

                                      To validate the Scylla-Monitoring version.

                                      +
                                      +
                                      +
                                      +

                                      Running in test mode

                                      +

                                      This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                                      +
                                      +

                                      Running second monitoring stack

                                      +

                                      We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                                      +
                                      ./start-all.sh -p 9091 -g 3001 -m 9095
                                      +
                                      +
                                      +

                                      Browse to http://{ip}:9091 and check the Grafana dashboard.

                                      +

                                      Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                      +
                                      +

                                      Caution

                                      +

                                      Important: do not use the local dir flag when testing!

                                      +
                                      +

                                      When you are satisfied with the data in the dashboard, you can shut down the containers.

                                      +
                                      +

                                      Caution

                                      +

                                      Important: Do not kill the 3.x version that is currently running!

                                      +
                                      +
                                      +
                                      +

                                      Killing the new 4.y Monitoring stack in testing mode

                                      +

                                      Use the following command to kill the containers:

                                      +
                                      ./kill-all.sh -p 9091 -g 3001 -m 9095
                                      +
                                      +
                                      +

                                      You can start and stop the new 4.y version while testing.

                                      +
                                      +
                                      +
                                      +

                                      Migrating

                                      +
                                      +

                                      Move to version 4.y (the new version)

                                      +

                                      Note: migrating will cause a few seconds of blackout in the system.

                                      +

                                      We assume that you are using external volume to store the metrics data.

                                      +
                                      +

                                      Backup

                                      +

                                      We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                                      +
                                      +
                                      +

                                      Kill all containers

                                      +

                                      At this point you have two monitoring stacks installed with the older version running.

                                      +

                                      If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                                      +

                                      kill the older 3.x version containers by running:

                                      +
                                      ./kill-all.sh
                                      +
                                      +
                                      +

                                      Start version 4.y in normal mode

                                      +

                                      From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                                      +
                                      ./start-all.sh -d /path/to/copy/data/dir
                                      +
                                      +
                                      +

                                      Point your browser to http://{ip}:3000 and see that the data is there.

                                      +
                                      +
                                      +
                                      +

                                      Rollback to version 3.x

                                      +

                                      To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                      +

                                      To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                                      +
                                      ./kill-all.sh
                                      +cd /path/to/scylla-grafana-3.x/
                                      +./start-all.sh -d /path/to/original/data/dir
                                      +
                                      +
                                      +
                                      +
                                      +
                                      +

                                      Post-installation: Metrics back-filling

                                      +

                                      Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                                      +

                                      For example, this is a recording rule that calculates the p99 write latency:

                                      +
                                      - record: wlatencyp99
                                      +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                                      +  labels:
                                      +    by: "instance,shard"
                                      +
                                      +
                                      +

                                      For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                                      +

                                      Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                                      +
                                      +
                                      +

                                      Note

                                      +

                                      If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                                      +
                                      +
                                      +
                                      +../_images/before-backfilling.png +
                                      +

                                      This is an example of missing latency graph

                                      +
                                      +
                                      +

                                      The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                                      +

                                      For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                                      +

                                      In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                                      +

                                      The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                                      +
                                      +

                                      Determine the backfilling period

                                      +

                                      When you run the backfilling process you need to determine the start time and end time.

                                      +
                                      +

                                      Determine the start time

                                      +

                                      The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                                      +

                                      If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                                      +

                                      For the rest of this example, we will assume that your retention time is 360 days.

                                      +
                                      +
                                      +

                                      Determine the end time

                                      +

                                      Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                                      +

                                      If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                                      +

                                      That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                                      +

                                      The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                                      +
                                      +
                                      +
                                      +

                                      Backfilling Process

                                      +
                                      +

                                      backup

                                      +

                                      If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                                      +

                                      To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                                      +
                                      +
                                      +

                                      Restart the monitoring stack

                                      +

                                      You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                                      +

                                      -b "--storage.tsdb.allow-overlapping-blocks"

                                      +
                                      +
                                      +

                                      Create the data files

                                      +

                                      We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                                      +

                                      The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                                      +

                                      Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                                      +
                                      docker exec -it aprom sh
                                      +cd /prometheus/data/
                                      +promtool tsdb create-blocks-from rules \
                                      +--start $start \
                                      +--end $end \
                                      +--url http://localhost:9090 \
                                      +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                                      +
                                      +
                                      +

                                      It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                                      +
                                      +
                                      +

                                      Note

                                      +

                                      Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                                      +
                                      +
                                      +
                                      +
                                      +

                                      Copy the data files

                                      +

                                      Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                                      +

                                      Copy the data files to the Prometheus directory:

                                      +
                                      cp data/* .
                                      +
                                      +
                                      +

                                      The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                                      +

                                      Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                                      +
                                      +../_images/after-backfilling.jpg +
                                      +

                                      Un example: after loading half of the data

                                      +
                                      +
                                      +
                                      +
                                      +
                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..db6a8fa11 --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,817 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b

                                      +

                                      This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1.

                                      +
                                      +

                                      Upgrade Procedure

                                      +

                                      We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                      +

                                      Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                      +
                                      +

                                      Install 4.y.b (The new version)

                                      +
                                      wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip
                                      +unzip scylla-monitoring-4.y.b.zip
                                      +cd scylla-monitoring-scylla-monitoring-4.y.b/
                                      +
                                      +
                                      +

                                      Replace “y” with the new minor release number, for example, 4.0.1.zip

                                      +
                                      +
                                      +

                                      Setting the server’s files

                                      +

                                      Copy the target files scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                      +
                                      cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/
                                      +cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/
                                      +
                                      +
                                      +
                                      +

                                      Validate the port numbers

                                      +

                                      ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent.

                                      +

                                      Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target.

                                      +
                                      +

                                      Caution

                                      +

                                      As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics.

                                      +
                                      +
                                      +
                                      +
                                      +

                                      Validate the new version is running the correct version

                                      +

                                      Run:

                                      +
                                      ./start-all.sh --version
                                      +
                                      +
                                      +

                                      To validate the Scylla-Monitoring version.

                                      +
                                      +
                                      +

                                      Validate the version installed correctly

                                      +

                                      To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack.

                                      +
                                      ./start-all.sh -p 9091 -g 3001 -m 9095
                                      +
                                      +
                                      +

                                      Browse to http://{ip}:9091 +And check the Grafana dashboard

                                      +

                                      Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                      +
                                      +

                                      Caution

                                      +

                                      Important: do not use the local dir flag when testing!

                                      +
                                      +

                                      When you are satisfied with the data in the dashboard, you can shut down the containers.

                                      +
                                      +

                                      Caution

                                      +

                                      Important: Do not kill the 4.x.a version that is currently running.

                                      +
                                      +
                                      +
                                      +

                                      Killing the new 4.y.b Monitoring stack in testing mode

                                      +

                                      Use the following command to kill the containers:

                                      +
                                      ./kill-all.sh -p 9091 -g 3001 -m 9095
                                      +
                                      +
                                      +

                                      You can start and stop the new 4.y.b version while testing.

                                      +
                                      +
                                      +

                                      Move to version 4.y.b (the new version)

                                      +

                                      Note: migrating will cause a few seconds of blackout in the system.

                                      +

                                      We assume that you are using external volume to store the metrics data.

                                      +
                                      +

                                      Kill all containers

                                      +

                                      At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                      +

                                      Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y.b Monitoring stack in testing mode +in the previous section

                                      +

                                      kill the older 4.x.a version containers by running:

                                      +
                                      ./kill-all.sh
                                      +
                                      +
                                      +

                                      Start version 4.y.b in normal mode

                                      +

                                      From the new root of the scylla-monitoring-scylla-monitoring-4.y.b run

                                      +
                                      ./start-all.sh -d /path/to/data/dir
                                      +
                                      +
                                      +

                                      Point your browser to http://{ip}:3000 and see that the data is there.

                                      +
                                      +
                                      +
                                      +

                                      Rollback to version 4.x.a

                                      +

                                      To rollback during the testing mode, follow Killing the new 4.y.b Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                      +

                                      To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run:

                                      +
                                      ./kill-all.sh
                                      +cd /path/to/scylla-grafana-4.x.a/
                                      +./start-all.sh -d /path/to/data/dir
                                      +
                                      +
                                      +
                                      +
                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlAllowFiltering.html b/stable/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..d9bdf6d7e --- /dev/null +++ b/stable/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Some queries use ALLOW FILTERING

                                      +

                                      Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                                      +

                                      These kinds of queries can create a bigger load on Scylla, and should be used with care.

                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlCLAll.html b/stable/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..5e863a8c6 --- /dev/null +++ b/stable/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Some queries use Consistency Level: ALL

                                      +

                                      Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                                      +

                                      Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                                      +

                                      Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlCLAny.html b/stable/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..e4dfa9504 --- /dev/null +++ b/stable/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Some queries use Consistency Level: ANY

                                      +

                                      Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                                      +

                                      Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlNoTokenAware.html b/stable/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..98e570f0c --- /dev/null +++ b/stable/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Some queries are not token-aware

                                      +

                                      Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                                      +

                                      Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlNonPaged.html b/stable/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..1f2ae077e --- /dev/null +++ b/stable/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Some SELECT queries are non-paged

                                      +

                                      By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                                      +
                                      +

                                      Blog-post Links

                                      +

                                      https://www.scylladb.com/2018/07/13/efficient-query-paging/

                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlNonPrepared.html b/stable/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..7b947a88f --- /dev/null +++ b/stable/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Some queries are non-prepared

                                      +

                                      Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlReverseOrder.html b/stable/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..653135154 --- /dev/null +++ b/stable/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/heavyCompaction.html b/stable/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..fc2a68be0 --- /dev/null +++ b/stable/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,697 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Compaction takes lots of memory and CPU

                                      +

                                      ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                                      +

                                      If this is the case, you can do one of the following:

                                      +
                                        +
                                      • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                                        +
                                        +
                                          +
                                        • In the scylla.yml configuration file: compaction_static_shares: 100

                                        • +
                                        • In the command line when starting ScyllaDB: --compaction-static-shares 100

                                        • +
                                        +
                                        +

                                        You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                                        +
                                      • +
                                      • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                                      • +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/index.html b/stable/use-monitoring/advisor/index.html new file mode 100644 index 000000000..3855c0cab --- /dev/null +++ b/stable/use-monitoring/advisor/index.html @@ -0,0 +1,710 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Scylla Monitoring Stack Advisor

                                      +
                                      +
                                      +

                                      The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                                      +
                                      +

                                      The Advisor section

                                      +
                                      +../../_images/advisor_panel.png +
                                      +

                                      The Advisor section

                                      +
                                      +
                                      +

                                      The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                                      +

                                      For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                                      +

                                      Each Advisor issue is explained in detail:

                                      + +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/nodeCLErrors.html b/stable/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..28b1d8be3 --- /dev/null +++ b/stable/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Some operation failed due to unsatisfied consistency level

                                      +

                                      ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                                      +

                                      For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                                      +

                                      When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/nodeIOErrors.html b/stable/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..4e1919dfe --- /dev/null +++ b/stable/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      I/O Errors can indicate a node with a faulty disk

                                      +

                                      I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/nodeLocalErrors.html b/stable/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..b634c5d4b --- /dev/null +++ b/stable/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Some operations failed on the replica side

                                      +

                                      ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                                      +

                                      An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/nonBalancedcqlTraffic.html b/stable/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..5b0badc0c --- /dev/null +++ b/stable/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      CQL queries are not balanced among shards

                                      +

                                      For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                                      +

                                      There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                                      +
                                      +

                                      Blog post link

                                      +

                                      https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/preparedCacheEviction.html b/stable/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..1b6e82088 --- /dev/null +++ b/stable/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      Prepared statements cache eviction

                                      +

                                      Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                                      +
                                        +
                                      • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                                      • +
                                      • The prepared statements cache might be too small for the number of prepared statements.

                                      • +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/systemOverload.html b/stable/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..42685f0f9 --- /dev/null +++ b/stable/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      System Overload

                                      +

                                      There could be multiple indications that a system is overloaded:

                                      +
                                        +
                                      • Timeouts

                                      • +
                                      • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                                      • +
                                      • CPU at 100% when no background process (like compaction or repair) runs.

                                      • +
                                      • Queues are getting filled.

                                      • +
                                      +

                                      If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/cql-optimization.html b/stable/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..d45dad0d0 --- /dev/null +++ b/stable/use-monitoring/cql-optimization.html @@ -0,0 +1,802 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + + + +
                                      +

                                      The CQL Optimization

                                      +

                                      The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                                      +
                                      +../_images/cql_optimization_master.png +
                                      +

                                      The CQL Dashboard

                                      +
                                      +
                                      +

                                      The upper part of the dashboard holds CQL related metrics.

                                      +

                                      The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                                      +
                                      +

                                      Note

                                      +

                                      Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                                      +
                                      +

                                      The following sections describe each of the dashboard’s panel

                                      +
                                      +

                                      Prepared Statements

                                      +

                                      Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                                      +

                                      Using prepared statements has the following benefits:

                                      +
                                        +
                                      • The database only needs to parse the query once

                                      • +
                                      • The driver can route the query to the right node

                                      • +
                                      • Using place-holders and values is safer and prevents CQL-Injection

                                      • +
                                      +

                                      The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                                      +

                                      The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                                      +
                                      +
                                      +

                                      Token Aware

                                      +

                                      Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                                      +

                                      Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                                      +

                                      The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                                      +

                                      The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                                      +
                                      +
                                      +

                                      Paged Queries

                                      +

                                      By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                                      +

                                      The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                                      +

                                      The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                                      +
                                      +
                                      +

                                      Reversed CQL Reads

                                      +

                                      ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                                      +

                                      We strongly recommend using use the correct ordering. +Querying with an order different than the order the CLUSTERING ORDER BY was defined is supported, but not advisable.

                                      +

                                      For example, look at the following table:

                                      +
                                      CREATE TABLE ks1.table_demo (
                                      +   category text,
                                      +   type int,
                                      +   PRIMARY KEY (category, type))
                                      +WITH CLUSTERING ORDER BY (type DESC);
                                      +
                                      +
                                      +

                                      The following query uses reverse order:

                                      +
                                      select * from ks1.table_demo where category='cat1' order by type ASC;
                                      +
                                      +
                                      +

                                      The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                                      +

                                      The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                                      +
                                      +
                                      +

                                      ALLOW FILTERING

                                      +

                                      Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                                      +

                                      These kinds of queries can create a big load on the system, and should be used with care.

                                      +

                                      The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                                      +

                                      The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                                      +

                                      The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                                      +

                                      The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                                      +

                                      The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                                      +
                                      +
                                      +

                                      Consistency Level

                                      +

                                      Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                                      +

                                      The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                                      +

                                      Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                                      +

                                      The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                                      +

                                      The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                                      +

                                      The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                                      +

                                      The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                                      +
                                      +
                                      +

                                      Cross DC

                                      +

                                      Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                                      +
                                      +
                                      +

                                      Cross DC Consistency Level

                                      +

                                      Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                                      +
                                      +
                                      +

                                      Cross DC read requests

                                      +
                                      +

                                      Note

                                      +

                                      The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                                      +
                                      +

                                      In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                                      +

                                      The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                                      +
                                      +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/cql_optimization.html b/stable/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..c1280fe53 --- /dev/null +++ b/stable/use-monitoring/cql_optimization.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/index.html b/stable/use-monitoring/index.html new file mode 100644 index 000000000..5b87ea135 --- /dev/null +++ b/stable/use-monitoring/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + +
                                      +
                                      + Menu +
                                      +
                                      +
                                      +
                                      +
                                      + + + + +
                                      + +
                                      + +
                                      +

                                      Using Scylla Monitoring Stack

                                      +
                                      +
                                      +

                                      There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                                      + +
                                      + + +
                                      + + + + + + + +
                                      + +
                                      + + + + +
                                      + + + + + + + \ No newline at end of file